
# Yayınlar API'si

Bir **yayın** tek bir giden gönderimdir: bir kitle, bir açılış mesajı, bir kanal ve bir zamanlama. İsteğe bağlı olarak, gelen yanıtları ele alan Yapay Zeka Temsilcisini de adlandırır. Yayınlar API'si, bu gönderimleri kontrol paneli yerine kendi kodunuzdan oluşturmanıza, fiyatlandırmanıza, başlatmanıza ve izlemenize olanak tanır. Ürünün kendisi için [Yayınlar kılavuzuna](../broadcasts/broadcasts.md) bakın.

- **Temel URL** — `https://api.youraiconnector.com/v1`
- **Kimlik Doğrulama** — API anahtarınız (bkz. [Kimlik Doğrulama](authentication.md))
- **Hatalar ve sayfalama** — bkz. [Hatalar ve Sayfalama](errors-and-pagination.md)

Aşağıdaki tüm örnekler cURL'de `?apiKey=` sorgu biçimini ve JavaScript ile Python'da `X-API-Key` başlığını göstermektedir; her ikisi de her uç noktada çalışır.

> **API gezgininde.** Bu sayfadaki her uç nokta, yayınlanmış OpenAPI spesifikasyonunda yer alır, böylece tam alanlarına göz atabilir ve [API gezgininde](reference.md) canlı istekler çalıştırabilirsiniz.


---

## Bir gönderim nasıl oluşturulur

Bir yayın göndermek tek bir çağrı değil, dört çağrıdan oluşur:

1. **Oluştur:** Yayını kitlesi, kanalı ve zamanlaması ile oluşturun — `Draft` olarak başlar.
2. **Açılış mesajını ayarlayın.** WhatsApp Business'ta bu, onay için bir şablon göndermek (veya zaten onaylanmış olanı seçmek) anlamına gelir. Diğer tüm kanallarda bu düz metindir.
3. **Maliyeti tahmin edin:** Herhangi bir harcama yapmadan önce fiyatı kontrol etmek isterseniz (isteğe bağlı).
4. **Başlatın.** Başlatma işlemi tam bir kontrol gerçekleştirir — kitle, mesaj, şablon onayı, bağlı gönderici — ve ya gönderimi başlatır ya da tam olarak neyin eksik olduğunu size söyler.

Siz başlatma çağrısı yapana kadar hiçbir şey gönderilmez.

---

## Yayın nesnesi

```json
{
  "id": "bcd123abc456",
  "name": "June promo",
  "status": "Draft",
  "channel": "whatsapp",
  "agent_id": "agt_789",
  "list_id": "lst_456",
  "list_name": "Newsletter subscribers",
  "total_contacts": 240,
  "send_to_new_list_members": false,
  "whats_app_template": {
    "body": "Hi {{first_name}}, our June offer is live.",
    "status": "approved",
    "sid": "HX0123...",
    "language": "en",
    "category": "marketing",
    "variables": ["first_name"]
  },
  "execution_date": 1781000000000,
  "drip_mode": true,
  "time_critical": false,
  "total_contacts_sent": 0,
  "credits_used": 0,
  "created_at": 1780900000000,
  "last_modified_at": 1780900000000
}
```

**Zaman damgaları epoch milisaniyeleri olarak geri döner** (`execution_date`, `created_at`, `last_modified_at`, …) ve herhangi bir kişi referansı `contacts/uid_whatsapp_15551234567` gibi bir yol dizisi olarak geri döner.

### Ayarladığınız alanlar

| Alan | Açıklama |
|---|---|
| `name` | Yayının kontrol panelindeki adı. |
| `channel` | Bu yayının gönderim yaptığı tek kanal: `whatsapp`, `whatsapp_web`, `sms`, `instagram`, `messenger`, `facebook`, `telegram`, `instagram_private`, `line`, `viber`, `imessage`, `email`, `chat_widget`, `custom_channel`. Bir yayının tam olarak bir kanalı vardır — aynı şeyi başka bir yere göndermek için [başka bir kanalda çoğaltın](#duplicate-a-broadcast). `tiktok` ve `skool` yalnızca yanıt içindir ve asla yayın yapılamaz. |
| `agent_id` | Yanıtları yanıtlayan Yapay Zeka Temsilcisi. Bunu `null` bırakırsanız yanıtlar bunun yerine ekip gelen kutunuza düşer. |
| `list_id` | Gönderim yapılacak kişi listesi. API'den kitleyi bu şekilde ayarlarsınız — listeleri oluşturmak ve doldurmak için [Kişiler](contacts.md) bölümüne bakın. |
| `list_name` | Yayının yanında gösterilen görünen ad. Kozmetiktir. |
| `send_to_new_list_members` | `true`, yayını aktif tutar, böylece listeye daha sonra eklenen herkes de açılış mesajını alır. |
| `whats_app_template` | Açılış mesajı. WhatsApp Business'ta bu gerçek bir onaylı şablondur; diğer tüm kanallarda `body` düz açılış metni olarak kullanılır. Bunu el ile değil, [şablon uç noktaları](#the-opening-message) aracılığıyla ayarlayın. |
| `opener_media` | Açılış mesajıyla birlikte gönderilen bir resim veya video. Her zaman tüm nesneyi gönderin (veya kaldırmak için `null` kullanın) — içindeki bireysel anahtarları yazmak reddedilir. SMS'te desteklenmez. |
| `execution_date` | Ne zaman gönderileceği. Bir ISO 8601 zaman damgası veya epoch milisaniyesi gönderin. Gelecekteki bir tarih gönderimi zamanlar; atlayın (veya geçmiş bir tarih kullanın) başlatır başlatmaz göndermek için. |
| `drip_mode` | `true`, gönderimi bir kerede değil, zaman içinde gruplar halinde hızlandırır. |
| `time_critical` | `true`, 50 kişiden sonra devreye giren otomatik hızlandırmadan çıkar — mesajı hemen alması gereken sıcak bir kitle için. Kanalın kendi günlük gönderim sınırını kaldırmaz. |
| `batch_size` | Kademeli gönderim sırasında grup başına kaç kişi olacağı. |
| `follow_up_config` | Asla yanıt vermeyen kişiler için takip zinciri. |

`user_id`, `id`, `status` veya `source_campaign_id` olarak gönderdiğiniz her şey oluşturma sırasında yoksayılır ve güncelleme sırasında düşürülür — durum yalnızca aşağıdaki başlatma, duraklatma ve devam ettirme uç noktaları aracılığıyla değişir.

### Platformun yönettiği alanlar

`status`, `total_contacts_sent`, `unique_contacts_replied`, `overall_reply_rate`, `credits_used`, `paused_reason`, `completion_summary`, grup sayaçları ve `contacts` (kontrol panelinden eklenen ve yol dizeleri olarak okunan bireysel kişiler). Bunları okuyun, yazmayın.

### Durumlar

| Durum | Anlamı |
|---|---|
| `Draft` | Oluşturuluyor. Hiçbir şey zamanlanmadı. |
| `Pending Approval` | Başlatıldı, ancak WhatsApp şablonu henüz bir karar bekliyor. Şablon onaylandığında otomatik olarak gönderime başlar — tekrar başlatmanıza gerek yoktur. |
| `Scheduled` | Gelecekteki bir `execution_date` ile başlatıldı. |
| `Sending` | Aktif olarak gönderiliyor (yeni liste üyeleri için hazırlanan bir yayın, onları beklerken burada kalır). |
| `Paused` | Beklemeye alındı — sizin tarafınızdan veya bir güvenlik kontrolü tarafından otomatik olarak. |
| `Sent` | Tamamlandı. |
| `Failed` | Gönderimlerin yarısından fazlası başarısız olarak tamamlandı. |

---

## Yayın oluştur

`POST /broadcasts` — bir `Draft` oluşturur.

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "June promo",
    "channel": "whatsapp",
    "list_id": "lst_456",
    "agent_id": "agt_789",
    "drip_mode": true,
    "execution_date": "2026-06-15T09:00:00.000Z"
  }'
```

**JavaScript**

```javascript
const res = await fetch("https://api.youraiconnector.com/v1/broadcasts", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({
    name: "June promo",
    channel: "whatsapp",
    list_id: "lst_456",
    agent_id: "agt_789",
    drip_mode: true,
    execution_date: "2026-06-15T09:00:00.000Z",
  }),
});
const { broadcast_id } = await res.json();
```

**Python**

```python
import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/broadcasts",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "name": "June promo",
        "channel": "whatsapp",
        "list_id": "lst_456",
        "agent_id": "agt_789",
        "drip_mode": True,
        "execution_date": "2026-06-15T09:00:00.000Z",
    },
)
print(res.json()["broadcast_id"])
```

**Yanıt** (`201`)

```json
{ "success": true, "broadcast_id": "bcd123abc456" }
```

---

## Yayınları listele

`GET /broadcasts` — hesaptaki her yayın, en yeniden eskiye doğru.

**Sorgu parametreleri**

| Parametre | Gerekli | Açıklama |
|---|---|---|
| `status` | Hayır | Yalnızca belirli bir durumdaki yayınları döndürür, örn. `Sending`. [durum tablosundaki](#statuses) yazımla tam olarak eşleşmelidir. |

```bash
curl "https://api.youraiconnector.com/v1/broadcasts?apiKey=YOUR_API_KEY&status=Sending"
```

```javascript
const res = await fetch("https://api.youraiconnector.com/v1/broadcasts?status=Sending", {
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const { broadcasts } = await res.json();
```

```python
res = requests.get(
    "https://api.youraiconnector.com/v1/broadcasts",
    headers={"X-API-Key": "YOUR_API_KEY"},
    params={"status": "Sending"},
)
broadcasts = res.json()["broadcasts"]
```

**Yanıt** (`200`)

```json
{ "success": true, "broadcasts": [{ "id": "bcd123abc456", "name": "June promo", "status": "Sending", "...": "..." }] }
```

---

## Yayın al

`GET /broadcasts/{broadcastId}` — `{ "success": true, "broadcast": { ... } }` döndürür. Devam eden bir gönderimi sorgulamak için kullanın: `total_contacts_sent`, `unique_contacts_replied`, `overall_reply_rate` ve `credits_used` ilerledikçe güncellenir.

```bash
curl "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456?apiKey=YOUR_API_KEY"
```

Hesabınızda bulunmayan bir yayın `404` döndürür.

---

## Yayın güncelle

`PUT /broadcasts/{broadcastId}` — yalnızca değiştirmek istediğiniz alanları gönderin. Ayrıca iç içe geçmiş bir nesnenin içindeki tek bir anahtarı noktalı yol ile belirtebilirsiniz, örn. `"whats_app_template.body"`.

```bash
curl -X PUT "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "June promo (v2)", "execution_date": "2026-06-16T09:00:00.000Z" }'
```

```javascript
await fetch("https://api.youraiconnector.com/v1/broadcasts/bcd123abc456", {
  method: "PUT",
  headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({ name: "June promo (v2)", execution_date: "2026-06-16T09:00:00.000Z" }),
});
```

Boş bir gövde `400` döndürür. Bilinmesi gereken iki kural:

- **`opener_media` ya hep ya hiçtir.** Nesnenin tamamını gönderin veya eki kaldırmak için `null` kullanın. İçine noktalı bir yol (`opener_media.name`) ile erişim, `400` ile reddedilir, çünkü kısmen güncellenmiş bir ek, orada olmayan bir dosyayı tanımlayacaktır.
- **Durum düzenlenemez.** [başlat](#launch-a-broadcast), [duraklat](#pause-and-resume) ve [devam ettir](#pause-and-resume) işlemlerini kullanın.

---

## Açılış mesajı

Her yayın, açılış mesajını `whats_app_template` içinde taşır. Bunun ne anlama geldiği kanala göre değişir:

- **WhatsApp Business** — WhatsApp tarafından onaylanmış bir şablon olmalıdır. Aşağıdaki iki uç noktadan birini kullanın.
- **Diğer tüm kanallar** (WhatsApp Web, SMS, Instagram, Messenger, Telegram, …) — aynı alanın `body` değeri, gönderilen metnin ta kendisidir. Bunu aşağıdaki uç nokta aracılığıyla göndermek, mesajı kaydeder ve WhatsApp'ı hiç dahil etmeden hazır olarak işaretler.

### Onay için şablon gönderin

`POST /broadcasts/{broadcastId}/template`

| Field | Required | Description |
|---|---|---|
| `body` | Yes | The message text, up to 1024 characters. Use `{{variable}}` placeholders for personalisation. |
| `name` | No | Template name. Defaults to the broadcast's name. |
| `language` | No | Language code. Defaults to `en`. |
| `category` | No | `marketing` (default), `utility`, `authentication`, or `authentication-international`. This is what the send is priced at, so keep it honest. |
| `variables` | No | The placeholder names, in the order they appear. Leave it out and they are read from the body — which is usually what you want, because the send fills them from each contact. |

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/template?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "body": "Hi {{first_name}}, our June offer is live until Friday.",
    "language": "en",
    "category": "marketing"
  }'
```

**Yanıt** (`200`)

```json
{ "success": true, "broadcast_id": "bcd123abc456", "template_status": "pending", "template_sid": "HX0123..." }
```

`template_status`, WhatsApp'ın belirttiği durumdur: incelenirken `pending`, kullanılabilir olduğunda `approved`, reddedildiyse `rejected`. WhatsApp dışı bir kanalda ise doğrudan `template_sid: null` ile `approved` olarak döner — incelenecek bir şey yoktur.

Sizi durduracak durumlar:

- Önceki bir şablon hala incelemedeyken gönderim yapmak `400` hatasını döndürür. Önce kararı bekleyin.
- Halihazırda onaylanmış bir şablonu düzenlemek, yeni şablon gelene kadar onaylı olanı yayında tutar, böylece devam eden bir yayın açılış mesajını asla kaybetmez.
- Doğrudan Meta üzerinden bağlanan bir WhatsApp numarasında, görsel veya video ekli bir yayın gönderilemez (`400`) — ekler, yönetilen WhatsApp Business hattında ve WhatsApp Web'de desteklenir.

### Daha önce onaylanmış bir şablonu kullanın

`POST /broadcasts/{broadcastId}/template/select` — [şablon kitaplığınızdaki](templates.md) halihazırda onaylanmış bir şablonu yayına kopyalar, böylece beklenecek bir şey kalmaz.

| Alan | Zorunlu | Açıklama |
|---|---|---|
| `template_id` | Evet | Hesabınızdaki onaylı bir şablonun kimliği (id). |

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/template/select?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "template_id": "tpl_abc123" }'
```

**Yanıt** (`200`)

```json
{
  "success": true,
  "broadcast_id": "bcd123abc456",
  "template_status": "approved",
  "template_sid": "HX0123...",
  "body": "Hi {{first_name}}, our June offer is live until Friday.",
  "name": "june_promo",
  "language": "en",
  "variables": ["first_name"],
  "category": "marketing"
}
```

Onay, kitaplık kaydından tarafımızca doğrulanır — siz sadece kimliği gönderirsiniz. Yayın bir WhatsApp taslağı değilse, şablon onaylı değilse, şablon bir açılış mesajı yerine takip mesajıysa veya yayında bir ek varsa (kitaplık şablonları sadece metindir) `400` alırsınız. Hesabınızda bulunmayan bir şablon kimliği `404` döndürür.

---

## Maliyeti tahmin edin

`POST /broadcasts/{broadcastId}/estimate-cost` — gönderimi onaylamadan önce fiyatlandırır. `whatsapp` ve `sms` yayınlarında kullanılabilir; diğer kanallar `400` döndürür. Tahmin kitle sayısını hesapladığı için yayının bir `list_id` değerine ihtiyacı vardır.

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/estimate-cost?apiKey=YOUR_API_KEY"
```

**WhatsApp yanıtı** (`200`) — hedef ülkeye göre dökümü alınmış krediler:

```json
{
  "success": true,
  "channel": "whatsapp",
  "billing_mode": "credits",
  "data": {
    "countries": [
      { "countryCode": "31", "name": "Netherlands", "iso": "NL", "flag": "🇳🇱", "contactCount": 180, "costPerContact": 1.2, "subtotal": 216 },
      { "countryCode": "1", "name": "United States", "iso": "US", "flag": "🇺🇸", "contactCount": 60, "costPerContact": 0.9, "subtotal": 54 }
    ],
    "totalContacts": 240,
    "totalTemplateCost": 270,
    "templateCategory": "marketing",
    "billing_mode": "credits",
    "service_messages_billable_soon": false
  }
}
```

**SMS yanıtı** (`200`) — Kendi Twilio hesabınız için güncel Twilio fiyatlandırmasına dayalı ABD doları cinsinden:

```json
{
  "success": true,
  "channel": "sms",
  "billing_mode": "twilio_direct",
  "data": {
    "totalContacts": 240,
    "messageLength": 118,
    "segmentsPerMessage": 1,
    "totalSegments": 240,
    "estimatedCostUsd": 1.788,
    "priceUnit": "USD",
    "billedByTwilio": true,
    "billing_mode": "twilio_direct",
    "service_messages_billable_soon": false
  }
}
```

**Bir numara göstermeden önce `billing_mode` kısmını okuyun.** Size kimin faturalandırıldığını söyler:

| `billing_mode` | Kim öder | Rakamlar ne anlama gelir |
|---|---|---|
| `credits` | <span data-t="appName">Your AI Connector</span> hesabınız | `totalTemplateCost` ve ülke bazlı rakamlar kredidir. |
| `twilio_direct` | Kendi Twilio hesabınız | `estimatedCostUsd`, Twilio'nun sizden tahsil edeceği tutardır. |
| `meta_waba_direct` | Meta tarafından faturalandırılan kendi WhatsApp İşletme Hesabınız | Her kredi rakamı `null` olarak geri döner — kasıtlı olarak, böylece asla "ücretsiz" ile karıştırılmaz. Ülke ve kişi sayıları yine de doğrudur. |

Bağlı Twilio kimlik bilgisi olmayan SMS'ler yine de segment sayılarını `estimatedCostUsd: 0` ile döndürür — bakılacak bir fiyatlandırma yoktur.

---

## Bir yayın başlatın

`POST /broadcasts/{broadcastId}/launch`

Başlatma işlemi önce her şeyi kontrol eder ve ancak o zaman yayını ilerletir. Kısmi başlatma yoktur: ya başlar ya da hiçbir şey değişmez ve nedenini belirten bir hata alırsınız.

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/launch?apiKey=YOUR_API_KEY"
```

**JavaScript**

```javascript
const res = await fetch("https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/launch", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
if (!data.success) console.error(data.error);
```

**Python**

```python
res = requests.post(
    "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/launch",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json())
```

**Yanıt** (`200`)

```json
{ "success": true, "broadcast_id": "bcd123abc456", "status": "Scheduled" }
```

`status`, yayının ulaştığı yerdir:

- `Scheduled` — `execution_date` gelecekte.
- `Sending` — şu anda başladı.
- `Pending Approval` — WhatsApp şablonu hala inceleme aşamasında. Şablon onaylanır onaylanmaz kendi kendine gönderilir; başlatmayı tekrar çağırmayın.

Yalnızca bir `Draft` (veya şablonu o zamandan beri onaylanmış bir `Pending Approval` yayını) başlatılabilir — başka herhangi bir şey `400` döndürür.

### Bir başlatma neden reddedilir

Bunların her biri, sade bir dille yazılmış bir `error` mesajı ile `400` olarak geri döner:

| Sorun | Ne düzeltilmeli |
|---|---|
| Hedef kitle yok | Başlatmadan önce `list_id` ayarlayın (veya kişileri ekleyin). |
| Açılış mesajı yok | Açılışı ayarlayın — bkz. [Açılış mesajı](#the-opening-message). |
| SMS'te ek var | SMS resim veya video taşıyamaz. Eki kaldırın veya yayını WhatsApp'a taşıyın. |
| Ek, onaylı şablonla eşleşmiyor | WhatsApp'ta medya onaylı şablonun içinde yer alır, bu nedenle eki sonradan değiştirmek şablonu yeniden göndermek anlamına gelir. |
| Şablon reddedildi | Mesajı yeniden yazın ve tekrar gönderin. |
| Şablon hiç gönderilmedi | Önce gönderin (veya onaylı bir tane seçin). |
| Şablon onaylandı ancak WhatsApp hesabınızda eksik | Genellikle numara bağlanmadan önce onaylanan bir şablondur. Tekrar gönderin. |
| Kanal için bağlı gönderici yok | Önce kanalı bağlayın — bkz. [Kanallar](channels.md). |
| Sadece yanıt verilebilir kanal | TikTok ve Skool bir işletmenin konuşma başlatmasına izin vermez, bu nedenle bunlarda yayın yapılamaz. |
| Zaten silahlandırılmış | Yayının zaten planlanmış bir gönderimi var. Tekrar başlatmadan önce duraklatın. |
| Hala onay bekleniyor | Şablon onaylandığında kendi kendine gönderilecektir. |
| WhatsApp İşletme Hesabı Meta tarafından engellendi | Meta, kendi WhatsApp İşletme Hesabınızda işletme tarafından başlatılan konuşmaları durdurdu — genellikle bir ödeme yöntemi sorunudur. Meta'nın İşletme Yöneticisi'nden düzeltin. |
| Klasik bir kampanyadan başlatıldı | Bunun yerine kampanya düzenleyicisinden başlatın. Bkz. [Yayınlardaki klasik kampanyalar](#broadcasts-that-mirror-a-classic-campaign). |

---

## Duraklat ve devam ettir

`POST /broadcasts/{broadcastId}/pause`, bir `Sending` veya `Scheduled` yayınını durdurur ve kuyruğa alınan her şeyi iptal eder.

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/pause?apiKey=YOUR_API_KEY"
```

Bir `Pending Approval` yayınını duraklatmak, onu tekrar `Draft` durumuna getirir; henüz hiçbir şey planlanmadığı için devam ettirilecek bir şey yoktur. Diğer tüm durumlar `400` sonucunu döndürür.

`POST /broadcasts/{broadcastId}/resume` bir `Paused` yayınını yeniden başlatır:

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/resume?apiKey=YOUR_API_KEY"
```

**Yanıt** (`200`)

```json
{ "success": true, "broadcast_id": "bcd123abc456" }
```

`Sending` durumuna veya `execution_date` değeri hala gelecekteyse tekrar `Scheduled` durumuna devam eder. Sadece `Paused` durumundaki bir yayın devam ettirilebilir.

---

## Düşük etkileşimli bir duraklamadan sonra gönderime devam etme

`POST /broadcasts/{broadcastId}/override-engagement-guard`

Bir yayın toplu olarak gönderilirken, bir sonrakine başlamadan önce her bir gruba kaç kişinin yanıt verdiğini ölçeriz. Neredeyse kimse yanıt vermiyorsa, yayın kendini duraklatır; sessizliğe doğru zorlamaya devam eden bir gönderim, bir numaranın filtrelenmesinin veya engellenmesinin en hızlı yoludur. Bu, kontrol panelindeki **Yine de devam et** düğmesidir.

Duraklamaya neden olan yanıt oranı yayın durdurulduğunda değişemeyeceğinden, basit bir [devam ettirme](#pause-and-resume) işlemi bir sonraki kontrolde tekrar duraklatılacaktır. Bu uç nokta, yine de devam etme kararıdır: bu yayındaki geçersiz kılma işlemini kaydeder ve yayın düşük etkileşim nedeniyle duraklatılmışsa, aynı çağrıda duraklamayı kaldırır.

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/override-engagement-guard?apiKey=YOUR_API_KEY"
```

**Yanıt** (`200`)

```json
{ "success": true, "broadcast_id": "bcd123abc456", "status": "Sending", "resumed": true }
```

- `resumed: true` — yayın düşük etkileşim nedeniyle duraklatılmıştı ve şimdi tekrar çalışıyor; `status`, devam ettiği durumdur.
- `resumed: false` — hiçbir şey kaldırılmadı, geçersiz kılma işlemi sadece gelecekteki kontroller için kaydedildi. Bu, yayın hiç duraklatılmadıysa veya farklı bir nedenle duraklatıldıysa (elle duraklattıysanız, bir gönderim sınırına ulaşıldıysa veya çok fazla gönderim hatası oluştuysa) alacağınız sonuçtur. Bu tür duraklamalar burada kaldırılmaz; nedeni çözdükten sonra kendiniz devam ettirin.

Geçersiz kılma işlemi sadece bu yayın için geçerlidir. Bu bir hesap ayarı değildir ve iki kez çağrılması güvenlidir.

---

## Bir yayını kopyalama

`POST /broadcasts/{broadcastId}/duplicate` — hedef kitleyi, mesajı ve ayarları yeni bir `Draft` içine kopyalar. Önceki çalışmaya dair her şey (sayaçlar, gruplar, zamanlama, yanıt istatistikleri) sıfırdan başlar.

| Alan | Zorunlu | Açıklama |
|---|---|---|
| `to_channel` | Hayır | Kopyayı farklı bir kanalda oluşturun. Aynı şeyi iki kanalda bu şekilde gönderirsiniz; bir yayının her zaman sadece bir kanalı vardır. |

```bash
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/duplicate?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "to_channel": "sms" }'
```

**Yanıt** (`201`)

```json
{ "success": true, "broadcast_id": "bcd999new111", "source_broadcast_id": "bcd123abc456" }
```

Bir kopya, canlı bir WhatsApp onayını asla devralmaz: bir WhatsApp kopyasında şablon onayınızı gerektirecek şekilde aktarılır ve başka bir kanala kopyalandığında şablon kaldırılır ve metin düz bir açılış mesajı haline gelir. SMS'e kopyalamak da herhangi bir eki kaldırır, çünkü SMS ek gönderemez.

---

## Bir yayını silme

`DELETE /broadcasts/{broadcastId}`

```bash
curl -X DELETE "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456?apiKey=YOUR_API_KEY"
```

Bir `Sending` veya `Scheduled` yayını `400` ile reddedilir — önce duraklatın.

---

## Klasik bir kampanyayı yansıtan yayınlar

Mesaj gönderen klasik kampanyalar Yayınlar'da da görünür ve API bunları yerel yayınlarla birlikte döndürür (bir `source_campaign_id` taşırlar). Kampanya kontrolü elinde tutmaya devam ettiği için biraz farklı davranırlar:

- **Düzenleme**: Hedef kitle, mesaj veya zamanlama üzerinde yapılan değişiklikler çalışır ve kampanyaya işlenir.
- **Kanal, yanıt Aracısı, ek ve tüm çalıştırma sayaçları** burada **salt okunurdur** — değiştirmeye çalışırsanız `400` alırsınız. Bunları kampanya üzerinden değiştirin.
- **Başlatma**, sizi kampanya düzenleyiciye yönlendiren bir `400` döndürür.
- **Duraklatma ve devam ettirme** çalışır ve kampanya üzerinde işlem yapar.
- **Silme**, `400` döndürür — bunun yerine kampanyayı silin, Yayınlar girişi de onunla birlikte silinecektir.
- **Çoğaltma**, kanıtlanmış bir kampanyayı taşımanın desteklenen yolu olan bağımsız bir yerel yayın oluşturur.

---

## Hatalar

Başarısız istekler şu durum kodlarıyla `{"success": false, "error": "<message>"}` döndürür:

| Durum | Anlamı |
|---|---|
| `400` | İstek veya yayının durumuyla ilgili bir sorun var; eksik bir alan, geçersiz bir ek veya yayının mevcut durumunda izin verilmeyen bir başlatma/duraklatma/devam ettirme/silme işlemi. `error` mesajı nedeni belirtir. |
| `401` | Eksik veya geçersiz API anahtarı. |
| `403` | Planınız API erişimini içermiyor. |
| `404` | Hesabınızda böyle bir yayın yok (veya şablon seçiminde böyle bir şablon yok). |
| `429` | Hız sınırı aşıldı. Bekleyin ve tekrar deneyin. |
| `500` | Bizim tarafımızda bir sorun oluştu. Kısa bir süre bekledikten sonra tekrar deneyin. |

---

## Sonraki adımlar

- [Yayınlar kılavuzu](../broadcasts/broadcasts.md) — hızlandırma ve güvenlik davranışı dahil olmak üzere bu uç noktaların arkasındaki ürün
- [Kişiler API'si](contacts.md) — yayının gönderileceği listeyi oluşturun
- [Şablonlar API'si](templates.md) — seçebileceğiniz onaylı WhatsApp şablonlarını yönetin
- [Webhooks API'si](webhooks.md) — yoklama yapmak yerine `Broadcast Started` ve `Broadcast Completed` için abone olun
