# Destek Talepleri

https://dev.wisecp.com/tr/destek-isteme

Destek talebi açan, yanıtlayan, kapatan ve puanlayan on bir uç.

## Genel Bakış

Destek talebi bir **konuşmadır**: müşteri açar, personel yanıtlar, konuşma kapanır. On bir uç bu konuşmanın her adımını kapsar.

Talep açmadan önce iki sözlüğü okumak gerekir: hangi **departmanların** hangi alanları sorduğu ve hangi **erişim gruplarının** şifreli bilgi kabul ettiği.

Şifre gibi bilgiler mesaj gövdesine yazılmaz. Erişim grupları için ayrı bir alan vardır ve oradaki parola tipli değerler **şifreli** saklanır.

## Referans

### Departmanları Listeleme

get/api/v1/client/tickets/departments

`Tickets/GetTicketDepartments` açılış şeması

Talep açılabilecek departmanları kendi alan şemalarıyla döndürür.

Dönen alanlar data[] — 4

idintDepartmanın numarası.

namestringDepartman adı.

descriptionstringNe için olduğu.

custom_fieldsobject[] custom_fields[]Açılışta sorulacak alanlar.

idintAlanın numarası. Gövdedeki haritanın anahtarı budur.

namestringAlanın etiketi.

typestringGiriş türü.

requiredboolBoş bırakılabilir mi.

optionsobject[]Seçimli alanlarda seçenekler. Değer ve etiket taşır; gönderilen değerdir.

Hatalar 2

ticket_system_disabled422Operatör destek sistemini kapatmış.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl 'https://panel.ornek.com/api/v1/client/tickets/departments' \
  -H "Authorization: Bearer $CLIENT_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/client/tickets/departments', {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
renderDepartmentForm(data[0].custom_fields);
```

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

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

```php
// Alan semasi DEPARTMAN BASINA degisir: formu secilen departmanin semasindan kurun.
$deps = Kernel::internal('client:Tickets/GetTicketDepartments', ['owner_id' => $uid])['data'];
$schema = array_column($deps, 'custom_fields', 'id')[$did] ?? [];
```

### Erişim Gruplarını Listeleme

get/api/v1/client/tickets/access-groups

`Tickets/GetTicketAccessGroups` şifreli alanlar

Mesaja eklenebilecek erişim bilgisi gruplarını şemalarıyla döndürür.

Dönen alanlar data[] — 3

idintGrubun numarası. Erişim satırındaki grup alanına bu değer verilir.

namestringGrubun adı.

custom_fieldsobject[] custom_fields[]Grubun erişim alanları.

idintAlanın numarası. Gövdedeki haritanın anahtarı budur.

namestringAlanın etiketi.

typestringGiriş türü.

requiredboolBoş bırakılabilir mi.

optionsobject[]Seçimli alanlarda seçenekler. Değer ve etiket taşır; gönderilen değerdir.

Hatalar 2

ticket_system_disabled422Operatör destek sistemini kapatmış.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl 'https://panel.ornek.com/api/v1/client/tickets/access-groups' \
  -H "Authorization: Bearer $CLIENT_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/client/tickets/access-groups', {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
const server = data.find((g) => g.name.includes('Server'));
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets/access-groups');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

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

```php
// Parola tipli alanlar SIFRELI saklanir; duz metin mesaj govdesine yazmak yerine bunu kullanin.
$groups = Kernel::internal('client:Tickets/GetTicketAccessGroups', ['owner_id' => $uid])['data'];
$creds = [['group_id' => $groups[0]['id'], 'fields' => $values]];
```

### Talepleri Listeleme

get/api/v1/client/tickets

`Tickets/GetTickets` durum sırası

Hesabın destek taleplerini durum sırasıyla döndürür.

Sorgu 5

pageintKaçıncı sayfa.

limitintSayfa başına satır. En çok 100.

statusstringDurum süzgeci. Müşteriye gösterilen durum sözlüğünü kabul eder.

departmentintDepartman süzgeci.

searchstringKonu, referans ve departman adında arar.

Dönen alanlar data[] — 11 + meta — 4

ticket_idintTalebin numarası.

refstringMüşterinin andığı referans.

subjectstringKonu.

statusstringHam durum.

statestringMüşteriye gösterilen durum.

priorityintÖncelik. Birden dörde: düşük, orta, yüksek, acil.

departmentobjectDepartman. Numara ve ad taşır.

ratingintTalebe verilen puan.

created_atstringAçıldığı an.

unreadboolOkunmamış bir personel yanıtı var mı.

last_replyobjectSon görünür mesaj. Anı ve kimin yazdığını taşır.

totalintToplam talep. Meta altında döner.

pageintBulunulan sayfa.

limitintSayfa boyutu.

next_pageintSonraki sayfa.

Hatalar 3

ticket_system_disabled422Operatör destek sistemini kapatmış.

status_invalid422Durum bilinen bir değer değil.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl 'https://panel.ornek.com/api/v1/client/tickets?status=answered' \
  -H "Authorization: Bearer $CLIENT_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/client/tickets?status=answered', {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
const waiting = data.filter((t) => t.unread);
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets?status=answered');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $clientKey],
]);

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

```php
// Okunmamis isareti YALNIZ listede gorunur: detayi okumak onu temizler, once listeden sayin.
$rows = Kernel::internal('client:Tickets/GetTickets', ['owner_id' => $uid])['data'];
$badge = count(array_filter($rows, fn ($t) => $t['unread']));
```

### Talep Açma

post/api/v1/client/tickets

`Tickets/CreateTicket` ek kabul eder

Yeni bir destek talebi açar.

Gövde 9

department_idintreqDepartmanın numarası.

subjectstringreqKonu.

messagestringreqAçılış mesajı. En az beş karakter; düz metindir ve işaretleme ayıklanır.

priorityintÖncelik. Verilmezse orta alınır.

service_idintTalebi bir hizmete bağlar.

custom_fieldsobjectDepartman alanlarının yanıtları. Alan numarasını değere eşler; kutu tipli alanlar dizi alır.

credentialsobject[]Erişim bilgileri. Her satır bir grup numarası ve alan haritası taşır; mesaja şifreli işlenir.

attachmentsarrayEkler. Kodlanmış içerik olarak gönderilir; adres reddedilir.

encrypt_messageboolMesaj gövdesi şifreli saklansın mı.

Dönen alanlar 201 — data — 13

dataobjectAçılan talebin tam detayı. Okuma ucuyla aynı şekildedir.

Hatalar 10

not_found404Bağlanmak istenen hizmet bu hesabın değil.

ticket_system_disabled422Operatör destek sistemini kapatmış.

subject_required422Konu boş.

department_invalid422Departman bilinmiyor ya da kapalı.

message_too_short422Mesaj beş karakterden kısa.

custom_field_required422Zorunlu bir departman alanı boş. Hangi alan olduğu yanıtın ayrıntısında gelir.

access_group_invalid422Erişim satırı bilinmeyen bir grup taşıyor.

credential_field_required422Zorunlu bir erişim alanı boş.

attachment_invalid422Ek adres olarak gönderilmiş ya da doğrulamayı geçemedi.

ticket_rejected422Bir kanca talebi reddetti.

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

```bash
curl -X POST 'https://panel.ornek.com/api/v1/client/tickets' \
  -H "Authorization: Bearer $CLIENT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"department_id":4,"subject":"Cannot reach my server","message":"SSH times out since this morning.","priority":3}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/client/tickets', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${clientKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    department_id: 4,
    subject,
    message,
    credentials: [{ group_id: 1, fields: { 30: ip, 32: password } }],
  }),
});

const { data } = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $clientKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode($ticket),
]);

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

```php
// Ekler talep KAYDEDILMEDEN once dogrulanir: bozuk dosya yarim bir talep birakmaz.
Kernel::internal('client:Tickets/CreateTicket', ['owner_id' => $uid] + $ticket);
```

### Talebi ve Mesajları Okuma

get/api/v1/client/tickets/{id}

`Tickets/GetTicket` okundu işaretler

Talebin üst bilgilerini ve bütün mesaj dizisini döndürür.

Dönen alanlar data — 13

ticket_idintTalebin numarası.

refstringMüşterinin andığı referans.

subjectstringKonu.

statusstringHam durum.

statestringMüşteriye gösterilen durum.

priorityintÖncelik. Birden dörde: düşük, orta, yüksek, acil.

departmentobjectDepartman. Numara ve ad taşır.

ratingintTalebe verilen puan.

created_atstringAçıldığı an.

lockedboolPersonel talebi kilitlemiş mi. Kilitliyken yanıt ve yeniden açma çalışmaz.

can_replyboolYanıt yazılabilir mi.

related_serviceobjectBağlı hizmet. Numara, ad, tür ve durum taşır.

last_reply_atstringSon mesajın anı.

messagesobject[] messages[]Görünür mesajlar, eskiden yeniye. Personelin iç notları hiç görünmez.

message_idintMesajın numarası. Personel yanıtını puanlarken bu numara verilir.

authorobjectYazan. Tür ve ad taşır.

is_htmlboolGövde işaretleme taşıyor mu. Personel mesajlarında doğru olabilir.

bodystringMesajın kendisi.

created_atstringYazıldığı an.

ratingintBu yanıta verilen puan. Yalnız personel mesajlarında dolar.

attachmentsobject[]Ekler. Numara, ad ve boyut taşır; içerik indirme ucundan alınır.

credentialsobject[]Çözülmüş erişim bilgileri. Grup ve alanları taşır; parola tipli değerler gizli işaretlenir.

Hatalar 3

not_found404Böyle bir talep yok ya da başka bir müşteriye ait.

ticket_system_disabled422Operatör destek sistemini kapatmış.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl 'https://panel.ornek.com/api/v1/client/tickets/429' \
  -H "Authorization: Bearer $CLIENT_KEY"
```

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

const { data } = await res.json();
renderThread(data.messages, data.can_reply);
```

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

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

```php
// Bu okuma OKUNDU isaretler: bildirim sayaci kuran bir is bunu cagirdiginda rozet duser.
$t = Kernel::internal('client:Tickets/GetTicket', ['owner_id' => $uid, 'id' => $id])['data'];
$html = array_filter($t['messages'], fn ($m) => $m['is_html']);
```

### Yanıt Yazma

post/api/v1/client/tickets/{id}/reply

`Tickets/ReplyTicket` ek kabul eder

Açık bir talebe yanıt ekler.

Gövde 4

messagestringreqYanıt metni. En az beş karakter.

credentialsobject[]Erişim bilgileri.

attachmentsarrayEkler.

encrypt_messageboolGövde şifreli saklansın mı.

Dönen alanlar data — 2

ticketobjectTalebin yeni durumu. Yanıt talebi bekliyor durumuna çeker.

messageobjectKaydedilen yanıt. Mesaj dizisindeki şekliyle gelir.

Hatalar 7

not_found404Böyle bir talep yok ya da başka bir müşteriye ait.

ticket_system_disabled422Operatör destek sistemini kapatmış.

ticket_not_open422Talep kapalı ya da kilitli.

message_too_short422Mesaj beş karakterden kısa.

access_group_invalid422Erişim satırları şemayı geçemedi.

attachment_invalid422Ek reddedildi.

reply_rejected422Bir kanca yanıtı reddetti.

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

```bash
curl -X POST 'https://panel.ornek.com/api/v1/client/tickets/429/reply' \
  -H "Authorization: Bearer $CLIENT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"message":"The firewall rule is back, thank you."}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/tickets/${id}/reply`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${clientKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ message }),
});

const { data } = await res.json();
appendMessage(data.message);
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets/' . $id . '/reply');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $clientKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['message' => $text]),
]);

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

```php
// Yanit talebi BEKLIYOR durumuna ceker: kapali bir talebe yanit yazilamaz, once yeniden acin.
$t = Kernel::internal('client:Tickets/GetTicket', ['owner_id' => $uid, 'id' => $id])['data'];
if (! $t['can_reply']) Kernel::internal('client:Tickets/ReopenTicket', ['owner_id' => $uid, 'id' => $id]);
```

### Talebi Kapatma

post/api/v1/client/tickets/{id}/close

`Tickets/CloseTicket` puan verilebilir

Talebi çözüldü olarak kapatır.

Gövde 1

ratingintKapatırken verilen puan. Yalnız talep henüz puansızken işlenir.

Dönen alanlar data — 3

ticket_idintTalebin numarası.

statusstringYeni ham durum.

statestringYeni gösterilen durum.

Hatalar 3

not_found404Böyle bir talep yok ya da başka bir müşteriye ait.

ticket_system_disabled422Operatör destek sistemini kapatmış.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X POST 'https://panel.ornek.com/api/v1/client/tickets/429/close' \
  -H "Authorization: Bearer $CLIENT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"rating":5}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/tickets/${id}/close`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${clientKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ rating: 5 }),
});

const { data } = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets/' . $id . '/close');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $clientKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['rating' => 5]),
]);

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

```php
// Kapatirken puan vermek TEK SANSTIR: talep zaten puanliysa gonderilen puan sessizce atlanir.
Kernel::internal('client:Tickets/CloseTicket', ['owner_id' => $uid, 'id' => $id, 'rating' => 5]);
```

### Talebi Yeniden Açma

post/api/v1/client/tickets/{id}/reopen

`Tickets/ReopenTicket` kilitliyse olmaz

Kapalı bir talebi yeniden açar.

Gövde —

——Gövde gerekmez, boş gönderin. Talebi adresteki numara belirler.

Dönen alanlar data — 3

ticket_idintTalebin numarası.

statusstringYeni ham durum.

statestringYeni gösterilen durum.

Hatalar 4

not_found404Böyle bir talep yok ya da başka bir müşteriye ait.

ticket_system_disabled422Operatör destek sistemini kapatmış.

ticket_locked422Personel talebi kilitlemiş.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X POST 'https://panel.ornek.com/api/v1/client/tickets/429/reopen' \
  -H "Authorization: Bearer $CLIENT_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/tickets/${id}/reopen`, {
  method: 'POST',
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
```

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

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

```php
// KILITLI talep yeniden acilamaz: bu durumda yeni bir talep acmak tek yoldur.
$t = Kernel::internal('client:Tickets/GetTicket', ['owner_id' => $uid, 'id' => $id])['data'];
if ($t['locked']) $openNewTicket();
```

### Talebi Puanlama

post/api/v1/client/tickets/{id}/rating

`Tickets/RateTicket` bir kez

Talebe bir ile beş arasında puan verir.

Gövde 1

ratingintreqVerilen puan. Birden beşe.

Dönen alanlar data — 2

ticket_idintTalebin numarası.

ratingintİşlenen puan.

Hatalar 5

not_found404Böyle bir talep yok ya da başka bir müşteriye ait.

ticket_system_disabled422Operatör destek sistemini kapatmış.

rating_invalid422Puan bir ile beş arasında değil.

already_rated422Talep zaten puanlanmış. Puan değiştirilemez.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X POST 'https://panel.ornek.com/api/v1/client/tickets/429/rating' \
  -H "Authorization: Bearer $CLIENT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"rating":5}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/tickets/${id}/rating`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${clientKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ rating }),
});

if (res.status === 422) hideRatingWidget();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets/' . $id . '/rating');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $clientKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['rating' => $n]),
]);

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

```php
// Puan KESINDIR: bir kez verildikten sonra degistirilemez, arayuzde onay isteyin.
$t = Kernel::internal('client:Tickets/GetTicket', ['owner_id' => $uid, 'id' => $id])['data'];
if ($t['rating'] === null) Kernel::internal('client:Tickets/RateTicket',
    ['owner_id' => $uid, 'id' => $id, 'rating' => $n]);
```

### Personel Yanıtını Puanlama

post/api/v1/client/tickets/{id}/replies/{rid}/rating

`Tickets/RateTicketReply` bir kez

Tek bir personel yanıtına puan verir.

Gövde 1

ratingintreqVerilen puan. Birden beşe.

Dönen alanlar data — 2

message_idintPuanlanan yanıtın numarası.

ratingintİşlenen puan.

Hatalar 5

not_found404Talep bulunamadı ya da verilen numara görünür bir personel yanıtı değil.

ticket_system_disabled422Operatör destek sistemini kapatmış.

rating_invalid422Puan bir ile beş arasında değil.

already_rated422Yanıt zaten puanlanmış.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X POST 'https://panel.ornek.com/api/v1/client/tickets/429/replies/878/rating' \
  -H "Authorization: Bearer $CLIENT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"rating":4}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/tickets/${id}/replies/${rid}/rating`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${clientKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ rating }),
});

const { data } = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/client/tickets/' . $id . '/replies/' . $rid . '/rating');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $clientKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['rating' => $n]),
]);

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

```php
// Yalniz PERSONEL yanitlari puanlanir: kendi mesajinizin numarasi bulunamadi doner.
$t = Kernel::internal('client:Tickets/GetTicket', ['owner_id' => $uid, 'id' => $id])['data'];
$staff = array_filter($t['messages'], fn ($m) => $m['author']['kind'] === 'staff');
```

### Eki İndirme

get/api/v1/client/tickets/{id}/attachments/{aid}

`Tickets/GetTicketAttachment` kodlanmış içerik

Bir mesaj ekini içeriğiyle birlikte döndürür.

Dönen alanlar data — 6

attachment_idintEkin numarası.

message_idintBağlı olduğu mesaj. Eski açılış kayıtlarında boş gelebilir.

namestringÖzgün dosya adı.

sizeintDosya boyutu.

mimestringUzantıdan çıkarılan tür. Bilinmeyen uzantıda genel bir değere düşer.

contentstringDosyanın kendisi. Kodlanmış olarak gelir.

Hatalar 3

not_found404Talep ya da ek bulunamadı, size ait değil, ya da gizli bir nottan geliyor.

ticket_system_disabled422Operatör destek sistemini kapatmış.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl 'https://panel.ornek.com/api/v1/client/tickets/429/attachments/55' \
  -H "Authorization: Bearer $CLIENT_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/client/tickets/${id}/attachments/${aid}`, {
  headers: { Authorization: `Bearer ${clientKey}` },
});

const { data } = await res.json();
const blob = await (await fetch(`data:${data.mime};base64,${data.content}`)).blob();
```

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

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

```php
// Icerik JSON icinde KODLU gelir: buyuk dosyalarda bellek kullanimini hesaba katin.
$a = Kernel::internal('client:Tickets/GetTicketAttachment',
    ['owner_id' => $uid, 'id' => $id, 'aid' => $aid])['data'];

file_put_contents($a['name'], base64_decode($a['content']));
```

## Tuzaklar

> **Detayı okumak okunmamış işaretini siler**
> 
> Talep detayını okumak hesabın **okunmamış işaretini temizler**. Bildirim rozeti kuran bir iş bu ucu çağırdığında rozet müşteri görmeden düşer. Sayımı liste ucundan yapın; detayı yalnız müşteri gerçekten açtığında çağırın.

> **Kilitli talep yeniden açılamaz**
> 
> Personel bir talebi kilitlediyse ne yanıt yazılabilir ne de yeniden açılabilir. Bu durum kapalı olmaktan **farklıdır**: kapalı bir talep yeniden açılır, kilitli olan açılmaz. Detaydaki kilit alanını okuyup arayüzde yeni talep açma yolunu gösterin.

> **Puan kesindir ve geri alınamaz**
> 
> Hem talep puanı hem personel yanıtı puanı **bir kez** verilir; ikinci deneme reddedilir. Kapatırken puan göndermek de aynı hakkı kullanır ve talep zaten puanlıysa o değer sessizce atlanır. Arayüzde onay isteyin.

> **Sırlar mesaj gövdesine değil erişim alanına yazılır**
> 
> Parola ve anahtar gibi bilgiler için ayrı bir yapı vardır: erişim grubu satırları. Oradaki parola tipli değerler **şifreli** saklanır ve yalnız sahibiyle personele çözülür. Aynı bilgiyi mesaj metnine yazmak onu düz metin olarak bırakır.

> **Ek adres olarak gönderilemez**
> 
> Ekler **kodlanmış içerik** olarak gönderilir; bir adres vermek reddedilir. Ekler talep kaydedilmeden önce doğrulanır, yani bozuk bir dosya yarım bir talep bırakmaz. İndirme de aynı biçimdedir: içerik kodlanmış olarak JSON içinde gelir.

> **İç notlar hiç görünmez**
> 
> Personelin kendi arasında yazdığı notlar mesaj dizisinde **hiç yer almaz** ve o notlardaki ekler indirilemez. Yani müşteri arayüzünde eksik görünen bir mesaj numarası hata değil, tasarımdır.

## İlgili Makaleler

- [Sahip Olunan Hizmetler](https://dev.wisecp.com/tr/sahip-olunan-hizmetler)
- [Client API İlk Çağrılar](https://dev.wisecp.com/tr/client-api-ilk-cagrilar)
