# Dahili Notlar ve Gizli Bilgiler

https://dev.wisecp.com/tr/dahili-notlar-ve-gizli-bilgiler

Personel-arası notları ve talepte saklanan gizli bilgileri yöneten dokuz uç.

## Genel Bakış

Bu dokuz uç talebin **müşterinin hiç görmediği** tarafıyla ilgilenir. Altısı personel-arası notları ve dosyalarını yönetir. Üçü ise etiketli gizli bilgileri tutar; sunucu erişimi gibi konuşma sırasında paylaşılan şeyler oraya konur.

İkisi de talebin **kendi satırında**, şifrelenmiş olarak yaşar. Ayrı tabloları yoktur, bu yüzden sayfalama ya da süzme de yoktur: liste her seferinde eksiksiz gelir.

Not eklemek bildirim üretmez ve talebin durumunu değiştirmez. Müşteriye görünmeyen ama **konuşmanın parçası** olan bir metin istiyorsanız aradığınız şey not değil, gizli işaretli bir yanıttır.

## Referans

### Notları Listeleme

get/api/v1/admin/tickets/{id}/notes

`Tickets/GetTicketNotes` admin

Talebe personelin bıraktığı notları döndürür.

Dönen alanlar data[] — 8

idstringNotun kimliği. Onaltı haneli bir dizedir; sıra numarası değildir.

author_idintNotu yazanın numarası.

messagestringNotun metni.

pinnedboolSabitlenmiş mi. Sabit notlar panelde üstte durur.

aiboolYapay zekânın yazıp yazmadığı. Panelde ayrı bir yazarla gösterilir.

legacyboolEski biçimden gelip gelmediği.

created_atstring | nullYazılma anı.

attachmentsarrayEkler: kimliği, görünen adı, saklanan adı ve boyutu.

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/tickets/402/notes' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

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

```php
// Sayfalama YOKTUR: notlarin tamami tek seferde gelir ve talebin satirindan cozulur.
$notes = Api::Tickets()->GetTicketNotes(['id' => $id])['data'];
```

### Not Ekleme

post/api/v1/admin/tickets/{id}/notes

`Tickets/AddTicketNote` admin

Talebe personel-arası bir not düşer.

Gövde 4

messagestringreqNotun metni.

pinnedboolNotu sabitler.

aiboolNotu yapay zekâ kaynaklı işaretler.

attachmentsstring | object | arrayEklenecek dosyalar.

Dönen alanlar 201 — data

dataobjectEklenen not. Listedeki öğeyle aynı şekildedir.

Hatalar 4

message_required422Not metni boş.

blocked_by_gate422Bir kanca notu reddetti.

not_found404Talep bulunamadı.

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/tickets/402/notes' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"message":"Muhasebeye devredildi.","pinned":true}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}/notes`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    message: 'Escalated to the billing team.',
    pinned: true,
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/notes');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'message' => 'Escalated to the billing team.',
        'pinned'  => true,
    ]),
]);

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

```php
// Not MUSTERIYE GITMEZ ve bildirim uretmez; yalniz personel gorur.
$note = Api::Tickets()->AddTicketNote([
    'id'      => $id,
    'message' => 'Escalated to the billing team.',
])['data'];
```

### Notu Güncelleme

patch/api/v1/admin/tickets/{id}/notes/{note_id}

`Tickets/UpdateTicketNote` admin

Notun metnini ya da sabitlenme durumunu değiştirir.

Gövde 2

messagestringYeni metin.

pinnedboolSabitler ya da sabitlemeyi kaldırır.

Dönen alanlar data

dataobjectGüncel not. Listedeki öğeyle aynı şekildedir.

Hatalar 5

no_changes422Hiçbir alan verilmedi. Boş gövde sessizce geçilmez.

message_required422Not metni boş.

update_failed422Güncelleme yazılamadı.

not_found404Talep ya da not 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/tickets/402/notes/1d9e35094420c723' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"pinned":false}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}/notes/${noteId}`, {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ pinned: false }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/notes/' . $noteId);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['pinned' => false]),
]);

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

```php
// Bos govde NO-OP degil HATADIR; en az bir alan gonderin.
Api::Tickets()->UpdateTicketNote([
    'id' => $id, 'note_id' => $noteId, 'pinned' => false,
]);
```

### Notu Silme

delete/api/v1/admin/tickets/{id}/notes/{note_id}

`Tickets/DeleteTicketNote` admin

Notu ve dosyalarını kaldırır.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

note_idstringSilinen notun kimliği.

Hatalar 3

delete_failed422Silme yazılamadı.

not_found404Talep ya da not 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/tickets/402/notes/1d9e35094420c723' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/notes/' . $noteId);
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
// Notun ekleri de gider; JSON'dan cikarilir ve dosyalar diskten silinir.
Api::Tickets()->DeleteTicketNote(['id' => $id, 'note_id' => $noteId]);
```

### Not Ekini İndirme

get/api/v1/admin/tickets/{id}/notes/{note_id}/attachments/{att_id}

`Tickets/GetTicketNoteAttachment` admin

Bir nota iliştirilmiş dosyayı içeriğiyle döndürür.

Dönen alanlar data — 6

idstringEkin kimliği.

namestringGörünen adı.

file_namestringDiskte saklanan adı.

file_sizeintDosyanın boyutu.

mimestringDosyanın türü.

content_base64stringDosyanın içeriği. Metne çevrilmiş hâlde gelir.

Hatalar 2

not_found404Ek bulunamadı ya da dosyası eksik.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl 'https://panel.ornek.com/api/v1/admin/tickets/402/notes/1d9e35094420c723/attachments/71c918b7ff525444' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch(
  `https://panel.ornek.com/api/v1/admin/tickets/${id}/notes/${noteId}/attachments/${attId}`,
  { headers: { Authorization: `Bearer ${apiKey}` } },
);
const { data } = await res.json();
```

```php
$url = 'https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/notes/' . $noteId . '/attachments/' . $attId;

$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
// Not ekleri talebin satirinda yasar; yanit ekleriyle AYNI uctan istenmezler.
$att = Api::Tickets()->GetTicketNoteAttachment([
    'id' => $id, 'note_id' => $noteId, 'att_id' => $attId,
])['data'];
```

### Not Ekini Silme

delete/api/v1/admin/tickets/{id}/notes/{note_id}/attachments/{att_id}

`Tickets/DeleteTicketNoteAttachment` admin

Bir not ekini kaydından ve diskten kaldırır.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

attachment_idstringSilinen ekin kimliği.

Hatalar 2

not_found404Talep, not ya da ek 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/tickets/402/notes/1d9e35094420c723/attachments/71c918b7ff525444' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(
  `https://panel.ornek.com/api/v1/admin/tickets/${id}/notes/${noteId}/attachments/${attId}`,
  { method: 'DELETE', headers: { Authorization: `Bearer ${apiKey}` } },
);

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

```php
$url = 'https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/notes/' . $noteId . '/attachments/' . $attId;

$ch = curl_init($url);
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
// Ek kaldirilir ama notun kendisi kalir; notu silmek ise eklerini de goturur.
Api::Tickets()->DeleteTicketNoteAttachment([
    'id' => $id, 'note_id' => $noteId, 'att_id' => $attId,
]);
```

### Gizli Bilgileri Listeleme

get/api/v1/admin/tickets/{id}/private-data

`Tickets/GetTicketPrivateData` admin içerik açık döner

Talebe eklenmiş etiketli gizli bilgileri döndürür.

Dönen alanlar data[] — 5

idstringKaydın kimliği.

labelstringNeyin bilgisi olduğu.

contentstringBilginin kendisi. Şifreli saklanır, burada çözülmüş gelir.

reply_idintBağlı olduğu yanıt. Sıfır, talebin geneline ait demektir.

created_atstring | nullEklenme anı.

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/tickets/402/private-data' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}/private-data`, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

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

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

```php
// Icerik ACIK doner: bu cagriyi loglayan bir istemci sunucu sifresini de loglar.
$items = Api::Tickets()->GetTicketPrivateData(['id' => $id])['data'];
```

### Gizli Bilgi Ekleme

post/api/v1/admin/tickets/{id}/private-data

`Tickets/AddTicketPrivateData` admin

Talebe etiketli bir gizli bilgi ekler.

Gövde 3

labelstringreqNeyin bilgisi olduğu.

contentstringreqBilginin kendisi. Saklanırken şifrelenir.

reply_idintBelirli bir yanıta bağlar.

Dönen alanlar 201 — data

dataobjectEklenen kayıt. Listedeki öğeyle aynı şekildedir.

Hatalar 3

label_content_required422Etiket ya da içerik boş.

not_found404Talep bulunamadı.

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/tickets/402/private-data' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"label":"Sunucu erisimi","content":"host: 203.0.113.10"}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}/private-data`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    label: 'Server SSH',
    content: 'host: 203.0.113.10\nuser: admin',
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/private-data');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'label'   => 'Server SSH',
        'content' => "host: 203.0.113.10\nuser: admin",
    ]),
]);

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

```php
// Bir yanita baglamak icin numarasini verin; sifir talebin geneline birakir.
Api::Tickets()->AddTicketPrivateData([
    'id'       => $id,
    'label'    => 'Server SSH',
    'content'  => $credentials,
    'reply_id' => $replyId,
]);
```

### Gizli Bilgiyi Silme

delete/api/v1/admin/tickets/{id}/private-data/{item_id}

`Tickets/DeleteTicketPrivateData` admin

Talepten bir gizli bilgi kaydını kaldırır.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

item_idstringSilinen kaydın kimliği.

Hatalar 2

not_found404Talep ya da kayıt 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/tickets/402/private-data/pd_65a4f0c8a1b23' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}/private-data/${itemId}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/private-data/' . $itemId);
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
// Talep kapaninca erisim bilgisini SILMEK iyi bir aliskanliktir; kayit kalicidir.
Api::Tickets()->DeleteTicketPrivateData(['id' => $id, 'item_id' => $itemId]);
```

## Tuzaklar

> **Gizli bilgiler açık metin döner**
> 
> Bu kayıtlar veritabanında şifreli durur, ama okuma ucu içeriği **çözülmüş** verir. Yani bu kapsamı taşıyan bir anahtar, orada duran sunucu parolalarını okuyabilir. İstek ve yanıtları günlüğe yazan bir istemci parolayı da günlüğe yazar; anahtarı dar tutun ve bu çağrının gövdesini kaydetmeyin.

> **Hepsi tek bir şifreli blokta durur**
> 
> Notlar ve gizli bilgiler ayrı satırlar değil, talebin satırındaki **tek bir şifreli alandır**. Her yazma bu bloğun tamamını yeniden kaydeder. İki istek aynı anda not eklerse ikincisi birincinin üzerine yazabilir; toplu iş yaparken aynı talebe paralel yazmayın.

> **Kimlikler sıra numarası değildir**
> 
> Notlar ve ekleri **dizeyle** adreslenir; listedeki sırasıyla değil. Eski panel konumu kullanıyordu ve araya not eklemek ya da silmek o konumu kaydırıyordu. Kendi tarafınızda sıra numarası saklarsanız bir gün başka bir notu güncellersiniz; dönen kimliği saklayın.

> **Boş güncelleme hata verir**
> 
> Not güncellemesinde hiçbir alan göndermezseniz çağrı **reddedilir**. Talep güncellemesi böyle davranmaz: orada değişmeyen alan sessizce geçilir. Farklı bir kaynaktan gelen veriyi olduğu gibi aktaran bir eşitleme betiği, değişiklik yokken burada hata alır. Göndermeden önce elinizde gerçekten bir alan olduğunu sınayın.

> **Birleştirme notları ve gizli bilgileri taşımaz**
> 
> Talepleri birleştirmek yanıtları ve eklerini ana talebe taşır, sonra diğer talep satırlarını **siler**. Notlar ve gizli bilgiler o satırlarda yaşadığı için birlikte gider. Aynısı talebi silmek için de geçerlidir. Bir sunucu parolasının tek kopyası orada duruyorsa birleştirmeden önce okuyup ana talebe yeniden yazın.

## İlgili Makaleler

- [Talep Yanıtları](https://dev.wisecp.com/tr/talep-yanitlari)
- [Talep Yönetimi](https://dev.wisecp.com/tr/talep-yonetimi)
- [Talep Özel Alan Tanımları](https://dev.wisecp.com/tr/talep-ozel-alan-tanimlari)
