# Bildirim Gönderme

https://dev.wisecp.com/tr/bildirim-gonderme

Müşteriye şablon, e-posta ya da SMS gönderen ve gönderileni geri okuyan beş uç.

## Genel Bakış

Bu uçlar bir müşteriye mesaj gönderir ve gönderileni geri okur. Üç gönderim yolu vardır: kayıtlı bir şablon, serbest bir e-posta ve serbest bir SMS.

Gönderimlerin hepsi **eş zamanlıdır**. Yanıt, gönderim denemesi bittikten sonra döner; kuyruğa alınmaz. Yavaş bir sağlayıcı isteğinizi de yavaşlatır.

## Referans

### Alıcıları Önizleme

get/api/v1/admin/clients/{id}/notifications/recipients

`Clients/GetClientNotificationRecipients` admin gönderim yok

Bir şablonun kimlere gideceğini gönderim yapmadan döndürür.

Sorgu parametreleri 2

templatestringŞablon kimliği, `grup/ad` biçiminde.

channelstring`email` ya da `sms`. Verirseniz yalnız o kanalın alıcıları döner.

Dönen alanlar data — 2

mailobject[]E-posta alıcıları. Her eleman `email` ve `name` taşır.

smsobject[]SMS alıcıları. Müşterinin telefonu yoksa boş dizidir.

Hatalar 3

not_found404Müşteri bulunamadı.

template_invalid422`template` `grup/ad` biçiminde değil.

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/42/notifications/recipients' \
  -H "Authorization: Bearer $API_KEY" \
  -d template=user/welcome
```

```javascript
const url = new URL('https://panel.ornek.com/api/v1/admin/clients/42/notifications/recipients');
url.searchParams.set('template', 'user/welcome');

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

```php
$url = 'https://panel.ornek.com/api/v1/admin/clients/42/notifications/recipients?' . http_build_query(['template' => 'user/welcome']);

$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
// Gondermeden once alici var mi diye bakin: alici yoksa gonderim sent: false doner.
$preview = Api::Clients()->GetClientNotificationRecipients([
    'id'       => 42,
    'template' => 'user/welcome',
], ['channel' => 'email']);

if (!($preview['data']['mail'] ?? [])) {
    return;
}
```

Yanıt 200

```json
{
  "data": {
    "mail": [
      { "email": "john@example.com", "name": "John Doe" }
    ],
    "sms": []
  }
}
```

### Şablon Gönderme

post/api/v1/admin/clients/{id}/notifications/template

`Clients/SendClientTemplate` admin eş zamanlı

Kayıtlı bir bildirim şablonunu müşteriye gönderir.

Gövde 2

templatestringzorunluŞablon kimliği, `grup/ad` biçiminde. İki parça da dolu olmalı: `user/welcome`.

channelstring`email` ya da `sms`. Varsayılan `email`.

Dönen alanlar data — 5

sentboolMüşteriye kanaldan ulaşıldıysa `true`. Kimseye ulaşmayan gönderim yine 200 ile, nedeniyle birlikte `false` döner.

reasonstringYalnız `sent` `false` iken: `disabled`, `blocked`, `module_not_configured`, `no_recipients` ya da `send_failed`.

messagestringYalnız `sent` `false` iken: İngilizce açıklama. `send_failed` durumunda modülün kendi hatasını taşır.

channelstringKullanılan kanal.

templatestringŞablonun kimliği.

Hatalar 3

not_found404Müşteri bulunamadı.

template_invalid422`template` `grup/ad` biçiminde değil.

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/notifications/template' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"template":"user/welcome","channel":"email"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/42/notifications/template', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ template: 'user/welcome', channel: 'email' }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/notifications/template');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'template' => 'user/welcome',
        'channel'  => 'email',
    ]),
]);

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

```php
$response = Api::Clients()->SendClientTemplate([
    'id'       => 42,
    'template' => 'user/welcome',
    'channel'  => 'email',
]);
```

### Özel E-posta Gönderme

post/api/v1/admin/clients/{id}/notifications/email

`Clients/SendClientEmail` admin eş zamanlı

Şablona bağlı olmadan, serbest konu ve gövdeyle e-posta gönderir.

Gövde 3

subjectstringzorunluE-posta konusu.

messagestringzorunluE-posta gövdesi.

copy_to_adminboolGönderen yöneticiye kopya iletir. Varsayılan kapalı.

Dönen alanlar data — 3

sentboolMüşteriye ulaşıldıysa `true`. Yalnız gönderen yöneticiye giden kopya sayılmaz.

reasonstringYalnız `sent` `false` iken. Şablon gönderimiyle aynı kodlar.

messagestringYalnız `sent` `false` iken: İngilizce açıklama.

Hatalar 4

not_found404Müşteri bulunamadı.

subject_required422`subject` boş.

message_required422`message` boş.

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/notifications/email' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"subject":"Hesabinizla ilgili bir guncelleme","message":"Merhaba, talebiniz islendi.","copy_to_admin":true}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/42/notifications/email', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    subject: 'Hesabinizla ilgili bir guncelleme',
    message: 'Merhaba, talebiniz islendi.',
    copy_to_admin: true,
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/notifications/email');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'subject'       => 'Hesabinizla ilgili bir guncelleme',
        'message'       => 'Merhaba, talebiniz islendi.',
        'copy_to_admin' => true,
    ]),
]);

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

```php
$response = Api::Clients()->SendClientEmail([
    'id'      => 42,
    'subject' => 'Hesabinizla ilgili bir guncelleme',
    'message' => 'Merhaba, talebiniz islendi.',
]);

// Musteriye ulasilmadiysa sent false olur; nedeni reason soyler.
$failed = !($response['data']['sent'] ?? false);
```

### Özel SMS Gönderme

post/api/v1/admin/clients/{id}/notifications/sms

`Clients/SendClientSms` admin eş zamanlı

Müşteriye serbest içerikli bir SMS gönderir.

Gövde 2

messagestringzorunluSMS gövdesi.

copy_to_adminboolGönderen yöneticinin profilindeki telefona kopya gönderir. Varsayılan kapalı; profilde telefon yoksa atlanır.

Dönen alanlar data — 3

sentboolMüşteriye ulaşıldıysa `true`.

reasonstringYalnız `sent` `false` iken. SMS modülü seçili değilse `module_not_configured` olur.

messagestringYalnız `sent` `false` iken: İngilizce açıklama.

Hatalar 3

not_found404Müşteri bulunamadı.

message_required422`message` boş.

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/notifications/sms' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"message":"Merhaba, talebiniz islendi."}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/42/notifications/sms', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ message: 'Merhaba, talebiniz islendi.' }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/notifications/sms');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['message' => 'Merhaba, talebiniz islendi.']),
]);

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

```php
$response = Api::Clients()->SendClientSms([
    'id'      => 42,
    'message' => 'Merhaba, talebiniz islendi.',
]);
```

### Gönderilmiş Mesajı Okuma

get/api/v1/admin/clients/messages/preview

`Clients/GetMessagePreview` admin şifresi çözülür

Daha önce gönderilmiş bir e-posta ya da SMS kaydının içeriğini döndürür. Güvenlik iletileri (parola sıfırlama, doğrulama ve transfer kodları) ve gizli işaretli kayıtlar, müşterinin Mesajlar sekmesindeki gibi boş gövdeyle ve `redacted` `true` olarak döner.

Sorgu parametreleri 2

typestringzorunlu`email` ya da `sms`.

idintzorunluKayıt kimliği. Müşteri kimliği değil, günlük kaydının kendi kimliği.

Dönen alanlar data — 4

typestringKayıt türü.

idintGünlük kaydının kimliği.

contentstringÇözülmüş mesaj içeriği. `redacted` `true` ise ya da saklanan gövde okunamıyorsa boş.

redactedboolGövde verilmediğinde `true`: güvenlik iletisi ya da `private` işaretli kayıt.

Hatalar 4

invalid_request422`type` ya da `id` eksik veya geçersiz.

not_found404Bu kimlikle günlük kaydı yok.

credential_privilege_required403Hizmet aktivasyon maili müşterinin hizmet kimlik bilgilerini taşır; okumak için anahtar sahibinde Hizmetleri Görüntüleme yetkisi gerekir.

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/messages/preview' \
  -H "Authorization: Bearer $API_KEY" \
  -d type=email \
  -d id=901
```

```javascript
const url = new URL('https://panel.ornek.com/api/v1/admin/clients/messages/preview');
url.searchParams.set('type', 'email');
url.searchParams.set('id', '901');

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

```php
$url = 'https://panel.ornek.com/api/v1/admin/clients/messages/preview?' . http_build_query(['type' => 'email', 'id' => 901]);

$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()->GetMessagePreview([], [
    'type' => 'email',
    'id'   => 901,
]);

$content = $response['data']['content'];
```

## Tuzaklar

> **200 müşterinin aldığı anlamına gelmez**
> 
> Kimseye ulaşmayan gönderim de 200 döner; `sent` `false` olur ve `reason` nedenini söyler: şablon kapalı, bir kural engelledi, kanal için modül seçili değil, müşterinin o kanalda adresi yok ya da teslim başarısız oldu. Kontrolü önce `sent`'e, sonra `reason`'a göre yazın. Gönderen yöneticiye giden kopya gönderim sayılmaz.

> **Adresi olmayan müşteri hata değildir**
> 
> Müşterinin e-postası ya da telefonu yoksa yanıt `no_recipients` nedeniyle `sent: false` olur. Böyle müşterileri baştan ayıklamak için önce önizleme ucunu çağırın ve listesi boş dönenleri atlayın.

> **İstek gönderim bitene kadar bekler**
> 
> Gönderim kuyruğa alınmaz. Toplu iş yazıyorsanız her müşteri için sağlayıcının yanıt süresini ödersiniz; zaman aşımı sınırınızı buna göre koyun.

## İlgili Makaleler

- [Müşteri Uçları](https://dev.wisecp.com/tr/musteri-uclari)
- [Hesap Durumu ve Toplu İşlem](https://dev.wisecp.com/tr/hesap-durumu-ve-toplu-islem)
