
# Kampanyalar API'si

Bir kampanya, yapay zeka botunun kişilerinizle konuşması için ihtiyaç duyduğu her şeyi bir araya getirir: talimatları, üzerinde çalıştığı kanallar, aktif saatleri ve takip davranışı. Kampanyalar API'si, kontrol paneli yerine kendi kodunuzdan kampanyaları listelemenize, oluşturmanıza, güncellemenize, çoğaltmanıza, etkinleştirmenize, arşivlemenize ve ince ayar yapmanıza olanak tanır.

Aşağıdaki tüm uç noktalar `https://api.youraiconnector.com/v1` temel URL'sine göredir. Her isteğin kimliği doğrulanmalıdır; API anahtarınızı nasıl alacağınız ve ileteceğiniz hakkında bilgi için [API Erişimi](../integrations/api-access.md) ve [Kimlik Doğrulama](authentication.md) bölümlerine bakın. API erişimi ücretli bir özelliktir; bu özellik olmadan istekler `403` ile reddedilir.

> **Dikkat:** Bazı örnekler basit `?apiKey=YOUR_API_KEY` sorgu biçimini, diğerleri ise `X-API-Key` başlığını kullanır. Her ikisi de her yerde çalışır; kurulumunuza hangisi uyuyorsa onu kullanın.

---

## Kampanya türleri

Bir kampanya oluşturduğunuzda şu türlerden birini seçmelisiniz:

| Tür | Ne işe yarar |
|---|---|
| `Incoming from Unknown Contacts` | Bot, size ilk kez mesaj gönderen kişilere yanıt verir. |
| `Outgoing` | Bot, kampanyaya eklediğiniz kişilerle konuşma başlatır. |
| `Keywords` | **Etkisiz - kullanmayın.** Bir `Keywords` kampanyası etkisizdir: geriye dönük uyumluluk için kabul edilmeye devam eder ancak her kanaldaki gelen yönlendirmeler için görünmezdir ve tetikleyici anahtar kelimelerini hiçbir şey okumaz. Bunun yerine bir Yapay Zeka Temsilcisi üzerinde **Anahtar Kelime** türünde bir Giriş Noktası kullanın. |
| `Combined` | Gelen ve giden davranışların bir karışımı. |

**Büyük/küçük harf duyarlılığı yoktur.** `type`, `status`, `booking_provider`, `first_response_mode`, `bot.anthropic_model` ve `bot.ai_speed` her türlü büyük/küçük harf kullanımını kabul eder — `"live"`, `"Live"` ve `"LIVE"` aynı şeydir — ve değer, kampanyayı okuduğunuzda geri dönen kanonik biçiminde saklanır. Tek istisna duraklatma çiftidir: `"Paused"` ve `"paused"` gerçekten farklı iki durumdur, bu nedenle `"PAUSED"` gibi belirsiz bir yazım, birini seçmenizi söyleyen bir `400` ile reddedilir.

### İki duraklatma durumu

| Durum | Kim yazar | Ne anlama gelir |
|---|---|---|
| `Paused` | Platformun kendi güvenlik kontrolleri (düşük etkileşim, tekrarlanan gönderim hataları, limit aşımı) ve daha yeni Temsilciler ve Yayınlar yüzeyleri | Kampanya bekletilir. Planlanmış bir tarama, neden ortadan kalktığında güvenlik duraklatmasını otomatik olarak kaldırabilir. |
| `paused` | Panodaki Duraklat düğmesi, `resumed` ile birlikte Devam Et | Bir kişi manuel olarak duraklattı. Planlanmış gönderimler iptal edilir ve devam ettirildiğinde yeniden oluşturulur. |

Her ikisi de kampanyayı durdurur: gelen yönlendirme yalnızca durum tam olarak `Live` olduğunda çalışır. **API'den duraklatmak için `Paused`, devam ettirmek için `Live` kullanın** — küçük harfli çift, pano düğmesi için mevcuttur ve onun için çalışır durumda tutulur.

Bunların hiçbiri, yapay zeka bir konuşma içinde yanıt vermeyi bıraktığında olan şey değildir. Bu, kişi bazlı bir anahtardır, kişi üzerinde `is_bot_active` — bir insan devraldığında, kişi vazgeçtiğinde veya yapay zeka sohbeti sonlandırdığında ayarlanır. Kampanyanın kendi durumu etkilenmez ve içindeki diğer tüm konuşmalar çalışmaya devam eder. Bkz. [bir kişi için yapay zekayı duraklatma veya devam ettirme](messages.md#pause-or-resume-the-ai-for-one-contact).

> **Kampanya oluşturmak, bir kanalı kimin yanıtlayacağına karar vermez.** Yönlendirme, kampanyalar tarafından değil, bir Yapay Zeka Temsilcisi üzerindeki **Giriş Noktaları** tarafından yönetilir. Her kanalın, yeni ve bilinmeyen kişileri yanıtlayan Temsilciyi adlandıran bir kanal varsayılan Giriş Noktası vardır: bunu `PUT /entry-points/channel-defaults` ile ayarlayın, hesap için kademenin canlı olup olmadığını `GET /entry-points/routing-status` ile kontrol edin, `DELETE /entry-points/channel-defaults` ile temizleyin. `POST /channels/campaign` hala eski kanal bazlı kampanya yönlendirme haritasını yazar, ancak bu haritaya artık hiçbir hesapta gelen yönlendirme için başvurulmaz; yalnızca geri alma işlemleri için tutulur. Buna göre geliştirme yapmayın. Her iki yüzeyin yan yana görünümü için [Bir kanalı kampanyaya yönlendirme](channels.md#route-a-channel-to-a-campaign) bölümüne bakın.

---

## Kampanyaları listele

`GET /campaigns`

Kampanyalarınızı en yeniden başlayarak döndürür. `archived=true` değerini iletmediğiniz sürece arşivlenmiş kampanyalar hariç tutulur.

**Sorgu parametreleri**

| Parametre | Gerekli | Açıklama |
|---|---|---|
| `limit` | Hayır | Döndürülecek maksimum kampanya sayısı. Varsayılan `50`, maksimum `100`. |
| `cursor` | Hayır | Sayfalandırma imleci. Bir sonraki sayfayı almak için önceki yanıttan `next_cursor` değerini iletin. |
| `archived` | Hayır | Arşivlenmiş kampanyaları dahil etmek için `true` olarak ayarlayın. |

**cURL**

```bash
curl "https://api.youraiconnector.com/v1/campaigns?limit=20&apiKey=YOUR_API_KEY"
```

**JavaScript**

```javascript
const res = await fetch("https://api.youraiconnector.com/v1/campaigns?limit=20", {
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
console.log(data.campaigns, data.next_cursor);
```

**Python**

```python
import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/campaigns",
    params={"limit": 20},
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
print(data["campaigns"], data["next_cursor"])
```

**Yanıt**

```json
{
  "success": true,
  "campaigns": [
    {
      "id": "NBCXrhqGPSFsd6MV7pRo",
      "name": "Inbound WhatsApp Leads",
      "type": "Incoming from Unknown Contacts",
      "status": "Live",
      "enabled": true,
      "archived": false,
      "created_at": 1700000000000,
      "ai_mode": true,
      "language": "en",
      "enabled_channels": ["whatsapp", "instagram"]
    }
  ],
  "next_cursor": "NBCXrhqGPSFsd6MV7pRo"
}
```

`next_cursor`, `null` olduğunda son sayfaya ulaşmışsınız demektir.

---

## Bir kampanya al

`GET /campaigns/{campaignId}`

Canlı bot yapılandırması (`bot`), takip ayarları, etkin kanallar ve tüm anahtar kelimeler dahil olmak üzere tam kampanya belgesini döndürür. Zaman damgaları epoch milisaniyesi olarak döner.

**cURL**

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

**JavaScript**

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

**Python**

```python
import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
campaign = res.json()["campaign"]
```

**Yanıt**

```json
{
  "success": true,
  "campaign": {
    "id": "NBCXrhqGPSFsd6MV7pRo",
    "name": "Inbound WhatsApp Leads",
    "type": "Incoming from Unknown Contacts",
    "status": "Live",
    "language": "en",
    "ai_mode": true,
    "enabled": true,
    "archived": false,
    "created_at": 1700000000000,
    "enabled_channels": ["whatsapp", "instagram"],
    "bot": {
      "instructions": "Greet warmly and ask about their goals.",
      "goal": "Book a discovery call.",
      "ai_speed": "balanced",
      "anthropic_model": "standard",
      "max_messages": 20
    }
  }
}
```

::: note
**Not:** Farklı bir hesaba ait olan kampanya `404 Campaign not found` ( `403` değil) döndürür, bu nedenle bir kimliğin başka bir hesapta mevcut olup olmadığını anlayamazsınız.
:::


---

## Bir kampanya oluştur

`POST /campaigns`

Yeni bir kampanya oluşturur. `name` ve `type` zorunludur; diğer her şey isteğe bağlıdır. Aynı istekte başka herhangi bir kampanya alanını dahil edebilirsiniz — örneğin `language`, `ai_mode` veya tam bir `bot` yapılandırma nesnesi — ve bu, yeni kampanya ile birlikte kaydedilecektir. Sahibi ve oluşturulma zamanı otomatik olarak ayarlanır.

**İstek alanları**

| Alan | Gerekli | Açıklama |
|---|---|---|
| `name` | Evet | Kampanya adı. |
| `type` | Evet | Yukarıdaki dört kampanya türünden biri. |
| `language` | Hayır | Botun yanıt verdiği dil (örneğin `"en"`). |
| `ai_mode` | Hayır | Yapay zeka modunun açık olup olmadığı (`true`/`false`). Bir yapay zeka temsilcisi tarafından yanıtlanan bir kampanyada, okumalar saklanan bir değer yerine temsilcinin **Etkin** geçiş düğmesini döndürür — aşağıda güncelleme ile ilgili nota bakın. |
| `bot` | Hayır | Bot yapılandırma nesnesi (bkz. [Bot yapılandırma alanları](#bot-configuration-fields)). |
| `list_id` | Hayır | Eklenecek kişi listesinin kimliği (ID). |
| `event_id` | Hayır | Yapay zekanın rezerve edebileceği etkinlik türünün kimliği (ID). |
| `event_ids` | Hayır | Etkinlik türü kimliklerinden oluşan bir dizi olarak aynı anda birden fazla etkinlik türü — ilki varsayılandır. `event_id` veya `event_ids` değerlerinden birini gönderin, ikisini birden göndermeyin. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Spring Promo",
    "type": "Outgoing",
    "language": "en",
    "ai_mode": true,
    "bot": {
      "instructions": "Greet warmly and ask about their goals.",
      "goal": "Book a discovery call."
    }
  }'
```

**JavaScript**

```javascript
const res = await fetch("https://api.youraiconnector.com/v1/campaigns", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    name: "Spring Promo",
    type: "Outgoing",
    language: "en",
    ai_mode: true,
    bot: {
      instructions: "Greet warmly and ask about their goals.",
      goal: "Book a discovery call.",
    },
  }),
});
const { campaign_id } = await res.json();
```

**Python**

```python
import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/campaigns",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "name": "Spring Promo",
        "type": "Outgoing",
        "language": "en",
        "ai_mode": True,
        "bot": {
            "instructions": "Greet warmly and ask about their goals.",
            "goal": "Book a discovery call.",
        },
    },
)
campaign_id = res.json()["campaign_id"]
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}
```

---

## Bir kampanyayı güncelle

`PUT /campaigns/{campaignId}`

Bir kampanyayı kısmen günceller — yalnızca değiştirmek istediğiniz alanları gönderin. Bu tek genel güncelleme fiilidir; `PATCH /campaigns/{campaignId}` yoktur (iki `PATCH` rotası, dar [etkinleştir](#enable-or-disable-a-campaign) ve [arşivle](#archive-or-restore-a-campaign) geçişleridir).

**Hangi alanları değiştirebilirsiniz.** Kampanya düzenleyicinin yazdığı her şey; `name`, `status`, `type`, `language`, `ai_mode`, `enabled_channels`, tetikleyici ve damla ayarları, rezervasyon ve takip bayrakları, Instagram/Facebook izleme alanları ve tüm `bot` yapılandırması dahil. Kimlik ve sahiplik, kampanyanın ömrü boyunca kilitlidir: `user`, `id` ve `created_at` reddedilir, uç noktanın tanımadığı herhangi bir alan adı da aynı şekilde reddedilir. Reddetme alan bazında değil, istek bazında yapılır — bir bilinmeyen anahtar `400` döndürür ve o istekteki **hiçbir şey** yazılmaz.

**Temsilci destekli bir kampanyadaki `ai_mode`, Temsilciyi yansıtır.** Bir kampanya bir AI Temsilcisi tarafından yanıtlandığında, kampanyayı okumak, o Temsilcinin **Etkin** anahtarından türetilen `ai_mode` değerini döndürür; bu, AI'nın yanıt verip vermeyeceğine karar veren tek anahtardır. Böyle bir kampanyada `ai_mode` yazılması kabul edilir ancak okuduğunuz değeri değiştirmez; bunun yerine Temsilcinin Etkin anahtarını açın veya kapatın (panodan veya Temsilciler API'si aracılığıyla). Temsilcisi olmayan klasik kampanyalarda, `ai_mode` daha önce olduğu gibi saklanan değeri okur ve yazar.

**Bot alanları birleştirilir, üzerine yazılmaz.** Bot ayarlarını noktalı anahtarlar (`"bot.instructions": "..."`) veya iç içe geçmiş bir nesne (`"bot": { "instructions": "..." }`) olarak gönderin — her ikisi de yaprak yaprak yazar, bu nedenle dışarıda bıraktığınız alanlar mevcut değerlerini korur. `bot.instructions`, `bot.goal`, `bot.rules` ve `bot.personality` bu şekilde düzenlenebilir, [Bot yapılandırma alanları](#bot-configuration-fields) altında listelenen diğer tüm bot ayarları da öyledir. Aynı durum `test_bot`, `frequency` ve `follow_up_config` için de geçerlidir.

Bir bot yapılandırmasını tamamen değiştirmek için — göndermediğiniz herhangi bir alanı silerek — tam nesne ile `bot_replace` (veya `test_bot_replace`) kullanın. Aynı nesne için bir değiştirme ve birleştirmeyi tek bir istekte birleştiremezsiniz; bu bir `400` döndürür.

::: note
**Not:** API aracılığıyla `bot.*` yazmak, canlı kampanya üzerinde **anında** etkili olur. Pano düzenleyici farklı çalışır: oradaki düzenlemeler taslak olarak kaydedilir ve yalnızca müşteri Yayınla'ya tıkladığında canlıya geçer. Dolayısıyla, bir müşterinin yayınlanmamış pano değişiklikleri varsa, bunlar `test_bot` içinde durur ve `bot`'nin bir API okuması, yapay zekanın şu anda ne kullandığını doğru bir şekilde gösterir.
:::


Birkaç alan doğrudan yazılmak yerine özel bir anahtar aracılığıyla ayarlanır: kişi listesi için `list_id`, etkinlik türü için `event_id` (veya yapay zekanın birkaç tane rezerve etmesine izin vermek için sıralı bir etkinlik türü kimlikleri dizisi olan `event_ids` — ilki varsayılandır; boş bir dizi hepsinin bağlantısını keser) ve kampanyanın kişileri için `contact_ids` (kişi kimliklerinden oluşan bir dizi) kullanın. Bilgi tabanı girişleri bu uç nokta ile değil, [SSS API](faqs.md) aracılığıyla yönetilir.

**Etiketler birleştirilmez, değiştirilir.** `tags` öğesini tam dizi olarak gönderdiğinizde, bu kampanya etiket kümesi haline gelir — alanlar ve tek bir etiketi ekleyen veya düzenleyen uç noktalar için [Kampanya etiketleri](#campaign-tags) bölümüne bakın.

**cURL**

```bash
curl -X PUT "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Spring Promo v2", "enabled_channels": ["whatsapp"] }'
```

**JavaScript**

```javascript
const res = await fetch(
  "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
  {
    method: "PUT",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      name: "Spring Promo v2",
      enabled_channels: ["whatsapp"],
    }),
  }
);
const data = await res.json();
```

**Python**

```python
import requests

res = requests.put(
    "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"name": "Spring Promo v2", "enabled_channels": ["whatsapp"]},
)
data = res.json()
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}
```

---

## Bir kampanyayı sil

`DELETE /campaigns/{campaignId}`

Bir kampanyayı kalıcı olarak siler. Bu işlem geri alınamaz; kampanyaya tekrar ihtiyaç duyabileceğinizi düşünüyorsanız, bunun yerine [arşivleyin](#archive-or-restore-a-campaign).

**cURL**

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

**JavaScript**

```javascript
const res = await fetch(
  "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
  { method: "DELETE", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
```

**Python**

```python
import requests

res = requests.delete(
    "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
```

**Yanıt**

```json
{
  "success": true
}
```

---

## Bir kampanyayı çoğaltma

`POST /campaigns/{campaignId}/duplicate`

Kampanyanın tüm ayarlarını koruyarak bir kopyasını oluşturur. Kopya **devre dışı** olarak başlar ve adına bir `(copy)` soneki eklenir; böylece siz açıkça etkinleştirene kadar asla ileti göndermez.

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/duplicate?apiKey=YOUR_API_KEY"
```

**JavaScript**

```javascript
const res = await fetch(
  "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/duplicate",
  { method: "POST", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const { campaign_id } = await res.json();
```

**Python**

```python
import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/duplicate",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
new_campaign_id = res.json()["campaign_id"]
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "aZ9plnewCopyId01234"
}
```

> **Aynı hesap içindeki** yinelenen kopyalar.

---


## Bir kampanyayı etkinleştirme veya devre dışı bırakma

`PATCH /campaigns/{campaignId}/enabled`

Bir kampanyayı açar veya kapatır. Devre dışı bırakılan bir kampanya kişilerle etkileşimi durdurur ancak tüm yapılandırmasını korur.

**İstek alanları**

| Alan | Zorunlu | Açıklama |
|---|---|---|
| `enabled` | Evet | Etkinleştirmek için `true`, devre dışı bırakmak için `false`. Boole değeri olmalıdır. |

**cURL**

```bash
curl -X PATCH "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/enabled?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "enabled": true }'
```

**JavaScript**

```javascript
const res = await fetch(
  "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/enabled",
  {
    method: "PATCH",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ enabled: true }),
  }
);
const data = await res.json();
```

**Python**

```python
import requests

res = requests.patch(
    "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/enabled",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"enabled": True},
)
data = res.json()
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "enabled": true
}
```

---

## Bir kampanyayı arşivleyin veya geri yükleyin

`PATCH /campaigns/{campaignId}/archived`

Bir kampanyayı arşivler veya geri yükler. Arşivlenen kampanyalar varsayılan kampanya listesinde gizlenir ancak tüm verilerini korurlar ve istendiği zaman geri yüklenebilirler.

**İstek alanları**

| Alan | Zorunlu | Açıklama |
|---|---|---|
| `archived` | Evet | Arşivlemek için `true`, geri yüklemek için `false`. Boole değeri olmalıdır. |

**cURL**

```bash
curl -X PATCH "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/archived?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "archived": true }'
```

**JavaScript**

```javascript
const res = await fetch(
  "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/archived",
  {
    method: "PATCH",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ archived: true }),
  }
);
const data = await res.json();
```

**Python**

```python
import requests

res = requests.patch(
    "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/archived",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"archived": True},
)
data = res.json()
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "archived": true
}
```

---

## Bot yapılandırmasını güncelle

`PUT /campaigns/{campaignId}/bot-config`

Bu, bireysel bot ayarlarını değiştirmenin güvenli yoludur. Gönderdiğiniz her alan mevcut bot yapılandırmasıyla **birleştirilir**, bu nedenle dışarıda bıraktığınız tüm alanlar korunur. Botun yalnızca bir kısmında değişiklik yapmak istediğinizde bunu campaign-update uç noktası yerine kullanın.

Alan anahtarları yalnızca harf, rakam, alt çizgi ve kısa çizgi içermelidir.

**cURL**

```bash
curl -X PUT "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/bot-config?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "instructions": "Always answer in a friendly, concise tone.",
    "ai_speed": "balanced"
  }'
```

**JavaScript**

```javascript
const res = await fetch(
  "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/bot-config",
  {
    method: "PUT",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      instructions: "Always answer in a friendly, concise tone.",
      ai_speed: "balanced",
    }),
  }
);
const data = await res.json();
```

**Python**

```python
import requests

res = requests.put(
    "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/bot-config",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "instructions": "Always answer in a friendly, concise tone.",
        "ai_speed": "balanced",
    },
)
data = res.json()
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}
```

### Bot yapılandırma alanları

Tüm bot alanları isteğe bağlıdır. Yalnızca ayarlamak istediklerinizi gönderin. Burada listelenenlerin dışındaki tüm ek bot alanları kabul edilir ve olduğu gibi saklanır.

| Alan | Tür | Açıklama |
|---|---|---|
| `instructions` | string | Botun kişilerle nasıl konuşacağını yönlendiren temel talimatlar. |
| `rules` | string | Botun her zaman uyması gereken katı kurallar. |
| `goal` | string | Botun her konuşmada ulaşması gereken sonuç. |
| `personality` | string | Bot için ses tonu ve kişilik açıklaması. |
| `ai_speed` | string | Yapay zekanın yanıt vermeden önce ne kadar muhakeme yapacağı. `fast`, `fast_thinker`, `balanced`, `thorough` değerlerinden biri. |
| `anthropic_model` | string | Bu kampanyanın yanıtları için kullanılan yapay zeka kalite düzeyi. `standard`, `economy` (kullanımdan kaldırıldı), `max`, `mini` değerlerinden biri. `max` ve `mini` yalnızca bu düzeyler için uygun olan hesaplarda etkili olur. |
| `max_messages` | integer | Konuşma başına maksimum bot mesajı sayısı. |
| `alert_human_when` | string | Botun bir insan ekip üyesini uyarması gereken koşullar. |
| `availability` | object | Botun aktif saat programı. Bunu buradan ayarlayabilir veya özel [aktif saatler uç noktası](#set-the-bot-active-hours) kullanabilirsiniz. |
| `follow_up_config` | object | Sağlandığı gibi saklanan takip davranışı yapılandırması. |

---

## Bot aktif saatlerini ayarla

`PUT /campaigns/{campaignId}/active-hours`

Botun uygunluk programını ayarlar. Yapılandırılmış zaman aralıklarının dışında bot otomatik olarak yanıt vermez. Bu, bot yapılandırmasının `availability` alanına yazılır.

**İstek alanları**

| Alan | Gerekli | Açıklama |
|---|---|---|
| `availability` | Evet | Haftanın günlerine göre anahtarlanmış bir nesne. İzin verilen anahtarlar `monday` ile `sunday` arasındadır; başka herhangi bir anahtar `400` döndürür. Dışarıda bıraktığınız günler değişmeden kalır. |

Her hafta içi günü ya tek bir zaman aralığı ya da bir aralık dizisi tutar. Bir aralık, 24 saatlik `HH:MM` biçiminde bir `start_time` ve `end_time` içerir.

**cURL**

```bash
curl -X PUT "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/active-hours?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "availability": {
      "monday": { "start_time": "09:00", "end_time": "17:00" },
      "tuesday": [
        { "start_time": "09:00", "end_time": "12:00" },
        { "start_time": "13:00", "end_time": "17:00" }
      ]
    }
  }'
```

**JavaScript**

```javascript
const res = await fetch(
  "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/active-hours",
  {
    method: "PUT",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      availability: {
        monday: { start_time: "09:00", end_time: "17:00" },
        tuesday: [
          { start_time: "09:00", end_time: "12:00" },
          { start_time: "13:00", end_time: "17:00" },
        ],
      },
    }),
  }
);
const data = await res.json();
```

**Python**

```python
import requests

res = requests.put(
    "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/active-hours",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "availability": {
            "monday": {"start_time": "09:00", "end_time": "17:00"},
            "tuesday": [
                {"start_time": "09:00", "end_time": "12:00"},
                {"start_time": "13:00", "end_time": "17:00"},
            ],
        }
    },
)
data = res.json()
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}
```

---

## Bir kampanyanın özel işlevlerini listele

`GET /campaigns/{campaignId}/custom-functions`

Bu kampanyaya bağlı olan ve tam tanımlara çözümlenmiş özel işlevleri döndürür. Özel işlevler, botun bir konuşma sırasında çağırabileceği harici HTTP eylemleridir; örneğin, mağazanızdaki stok durumunu kontrol etmek veya CRM'inizde bir kayıt oluşturmak gibi.

**cURL**

```bash
curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/custom-functions?apiKey=YOUR_API_KEY"
```

**JavaScript**

```javascript
const res = await fetch(
  "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/custom-functions",
  { headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const { custom_functions } = await res.json();
```

**Python**

```python
import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/custom-functions",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
custom_functions = res.json()["custom_functions"]
```

**Yanıt**

```json
{
  "success": true,
  "custom_functions": [
    {
      "id": "fn_abc123",
      "name": "check_stock",
      "description": "Looks up whether a product is in stock.",
      "url": "https://example.com/api/stock",
      "method": "POST",
      "input": [
        { "name": "sku", "type": "string" }
      ],
      "ai_action": "Tell the customer whether the item is available.",
      "created_at": 1700000000000,
      "updated_at": 1700000500000
    }
  ]
}
```

---

## Bir özel işlevi bir kampanyaya bağlayın

`POST /campaigns/{campaignId}/custom-functions`

Botun bir görüşme sırasında çağırabilmesi için mevcut bir [özel işlevi](../ai-automation/custom-functions.md) bu kampanyaya bağlar. Zaten bağlı olan bir işlevi bağlamak hiçbir işlem yapmaz.

| Alan | Gerekli | Açıklama |
|---|---|---|
| `custom_function_id` | Evet | Bağlanacak özel işlevin kimliği (ID). |

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/custom-functions?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "custom_function_id": "fn_abc123" }'
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "custom_function_id": "fn_abc123"
}
```

---

## Bir özel işlevin bir kampanyayla bağlantısını kesin

`DELETE /campaigns/{campaignId}/custom-functions/{customFunctionId}`

Bağlı olmayan bir işlevin bağlantısını kesmek hiçbir işlem yapmaz.

```bash
curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/custom-functions/fn_abc123?apiKey=YOUR_API_KEY"
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "custom_function_id": "fn_abc123"
}
```

---

## Bir bilgi tabanı kaynağını bir kampanyaya bağlayın

`POST /campaigns/{campaignId}/kb-sources`

Botun yanıt verirken yararlanabilmesi için bir bilgi tabanı kaynağını ([SSS API](faqs.md) aracılığıyla oluşturulmuş) bu kampanyaya bağlar. Zaten bağlı olan bir kaynağı bağlamak hiçbir işlem yapmaz.

| Alan | Gerekli | Açıklama |
|---|---|---|
| `kb_source_id` | Evet | Bağlanacak bilgi tabanı kaynağının kimliği (ID). |

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/kb-sources?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "kb_source_id": "kb_abc123" }'
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "kb_source_id": "kb_abc123"
}
```

---

## Bir bilgi tabanı kaynağının bir kampanyayla bağlantısını kesin

`DELETE /campaigns/{campaignId}/kb-sources/{kbSourceId}`

Bağlı olmayan bir kaynağın bağlantısını kesmek hiçbir işlem yapmaz.

```bash
curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/kb-sources/kb_abc123?apiKey=YOUR_API_KEY"
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "kb_source_id": "kb_abc123"
}
```

---

## Bir MCP sunucusunu bir kampanyaya bağlayın

`POST /campaigns/{campaignId}/mcp-servers`

Bir MCP sunucusunu bu kampanyaya bağlayarak, botun bir görüşme sırasında o sunucunun araçlarına erişmesini sağlar. Hâlihazırda bağlı olan bir sunucuyu bağlamak hiçbir işlem yapmaz.

| Alan | Gerekli | Açıklama |
|---|---|---|
| `mcp_server_id` | Evet | Bağlanacak MCP sunucusunun kimliği (ID). |

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/mcp-servers?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "mcp_server_id": "mcp_abc123" }'
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "mcp_server_id": "mcp_abc123"
}
```

---

## Bir MCP sunucusunun kampanyayla bağlantısını kesme

`DELETE /campaigns/{campaignId}/mcp-servers/{mcpServerId}`

Bağlı olmayan bir sunucunun bağlantısını kesmek hiçbir işlem yapmaz.

```bash
curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/mcp-servers/mcp_abc123?apiKey=YOUR_API_KEY"
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "mcp_server_id": "mcp_abc123"
}
```

---

## Kampanya medya kütüphanesi

Medya kütüphanesi, botun bir görüşme sırasında gönderebileceği görselleri, videoları, belgeleri ve sesli notları barındırır.

### Bir kampanyanın medya kütüphanesini listeleme

`GET /campaigns/{campaignId}/media-library`

```bash
curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/media-library?apiKey=YOUR_API_KEY"
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "media_items": [
    {
      "id": "media_abc123",
      "item_id": "media_abc123",
      "title": "Pricing sheet",
      "description": "Send when the contact asks about pricing.",
      "media_url": "https://example.com/pricing.pdf",
      "media_content_type": "application/pdf",
      "type": "document",
      "agent_id": "",
      "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
      "media_home": "campaign"
    }
  ]
}
```

`media_url`, yükleme sırasında oluşturulan imzalı bir URL'dir; siz onu tekrar okuduğunuzda süresi dolmuş olabilir; kontrol paneli istendiğinde onu yeniden imzalar.

### Bir medya öğesi yükleme

`POST /campaigns/{campaignId}/media-library`

| Alan | Gerekli | Açıklama |
|---|---|---|
| `base64Data` | Evet | Dosya, base64 kodlu (data-URL öneki olmadan). |
| `mimeType` | Evet | Dosyanın MIME türü (örneğin `image/png`). |
| `title` | Evet | Kütüphanede ve yapay zeka isteminde gösterilen kısa etiket. |
| `description` | Evet | Bota bu öğeyi **ne zaman** göndereceğini söyleyen talimat. |
| `fileName` | Hayır | Depolama nesnesi adını oluşturmak için kullanılan orijinal dosya adı. |
| `sendMessage` | Hayır | Botun bu öğeyi gönderirken kullanması gereken tercih edilen ifade. |
| `maxSendsPerConversation` | Hayır | Botun bir görüşmede bu öğeyi bir kişiye gönderebileceği maksimum sayı. Varsayılan değer `1`'dir. |
| `sendAsVoiceNote` | Hayır | Ses yüklemesi için, onu bir WhatsApp sesli notuna dönüştürün. Varsayılan değer `false`'dur (düz bir ses dosyası olarak saklanır). |

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/media-library?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "base64Data": "iVBORw0KGgoAAAANSUhEUgAA...",
    "mimeType": "image/png",
    "title": "Product photo",
    "description": "Send when the contact asks what the product looks like."
  }'
```

**Yanıt**

```json
{
  "success": true,
  "itemId": "media_abc123",
  "mediaUrl": "https://example.com/product.png",
  "storagePath": "ai_media/campaigns/NBCXrhqGPSFsd6MV7pRo/media_abc123.png",
  "mediaContentType": "image/png",
  "type": "image",
  "isVoiceNote": false
}
```

### Bir medya öğesini güncelle

`PATCH /campaigns/{campaignId}/media-library/{itemId}`

Yalnızca öğenin meta verilerini düzenler — dosyanın kendisini değiştirmek için öğeyi silip yenisini yükleyin.

| Alan | Açıklama |
|---|---|
| `title` | Kısa etiket. |
| `description` | Ne zaman gönderileceğine dair talimat. |
| `send_message` | Botun kullanması için tercih edilen ifade. |
| `max_sends_per_conversation` | Negatif olmayan tam sayı veya sınırı kaldırmak için `null`. |

```bash
curl -X PATCH "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/media-library/media_abc123?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "title": "Updated pricing sheet" }'
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "item_id": "media_abc123"
}
```

### Bir medya öğesini sil

`DELETE /campaigns/{campaignId}/media-library/{itemId}`

Zaten silinmiş bir öğeyi silmek hiçbir işlem yapmaz.

```bash
curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/media-library/media_abc123?apiKey=YOUR_API_KEY"
```

**Yanıt**

```json
{ "success": true, "deleted": true }
```

---

## Kampanya etiketleri

Kampanya etiketi, botun bir görüşme sırasında kişiye uygulamasını öğrettiğiniz bir etikettir — `hot-lead`, `not-interested`, `booked-a-call`. Her etiketin üç parçası vardır:

| Alan | Tür | Açıklama |
|---|---|---|
| `name` | string, gerekli | Etiketin kendisi. Botun kişiye uyguladığı ve daha sonra eşleştirme yapacağınız değer budur, bu yüzden kısa ve sabit tutun. |
| `description` | string | Bota bu etiketi **ne zaman** uygulayacağını söyleyen talimat. İşi yapan kısım budur — "kişi topluluğa katıldığını onaylar" ifadesi kullanılır, "sıcak müşteri adayı" ifadesi kullanılmaz. |
| `webhook` | string | Etiket bir kişiye uygulandığı anda `POST` alan bir URL. İhtiyacınız yoksa boş bırakın. |
| `tag_id` | string | İsteğe bağlı. Bu girişi, yeni bir etiket yerine hesabınızdaki mevcut bir etikete bağlar. Bu belirli etikete daha sonra aşağıdaki tek etiket uç noktalarıyla erişmek istiyorsanız bunu sağlayın. |

Etiket adları bir kampanya içinde benzersiz olmalıdır. Bot etiketleri **ada göre** uygular, bu nedenle aynı adı paylaşan iki girişin kazananı tanımlı değildir.

### Bir kampanyanın tüm etiketlerini ayarlama

`PUT /campaigns/{campaignId}`, `tags` dizisi ile.

Bu işlem, kampanyanın etiketlerini tam olarak gönderdiğiniz verilerle değiştirir; bu, kontrol panelindeki Etiketler sekmesini kaydettiğinizde yapılan işlemin aynısıdır. **Her seferinde tam diziyi gönderin** — dışarıda bıraktığınız bir etiket, sildiğiniz bir etiket demektir. `[]` göndermek hepsini temizler.

**cURL**

```bash
curl -X PUT "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tags": [
      {
        "name": "hot-lead",
        "description": "The person confirms they want to buy, or asks how to get started right away.",
        "webhook": "https://example.com/hooks/campaign-events"
      },
      {
        "name": "not-interested",
        "description": "The person declines the offer or says they are not a fit."
      }
    ]
  }'
```

**JavaScript**

```javascript
const res = await fetch(
  "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
  {
    method: "PUT",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      tags: [
        {
          name: "hot-lead",
          description:
            "The person confirms they want to buy, or asks how to get started right away.",
          webhook: "https://example.com/hooks/campaign-events",
        },
        {
          name: "not-interested",
          description: "The person declines the offer or says they are not a fit.",
        },
      ],
    }),
  }
);
const data = await res.json();
```

**Python**

```python
import requests

res = requests.put(
    "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "tags": [
            {
                "name": "hot-lead",
                "description": "The person confirms they want to buy, or asks how to get started right away.",
                "webhook": "https://example.com/hooks/campaign-events",
            },
            {
                "name": "not-interested",
                "description": "The person declines the offer or says they are not a fit.",
            },
        ]
    },
)
data = res.json()
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}
```

Etiketleri [`GET /campaigns/{campaignId}`](#get-a-campaign) ile geri okuyun.

### Bir etiket ekleme

`POST /campaigns/{campaignId}/tags`

Geri kalanını yeniden göndermeden tek bir etiket ekler. Bunu, bu istekte oluşturmadığınız bir kümeye ekleme yaparken kullanın.

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/tags?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "tag": { "name": "booked-a-call", "description": "The person confirms a booked time." } }'
```

Tam olarak aynı etiketi iki kez göndermek, ikinci seferde hiçbir şey yapmaz. Aynı `tag_id` değerini farklı bir ad veya açıklama ile göndermek, ilkini düzenlemek yerine **ikinci** bir giriş ekler — yerinde düzenleme yapmak için aşağıdaki uç noktayı kullanın.

### Bir etiketi güncelleme veya kaldırma

`PUT /campaigns/{campaignId}/tags/{tagId}`
`DELETE /campaigns/{campaignId}/tags/{tagId}`

Bunlar, bir girdiyi `tag_id` değeriyle adresler, bu nedenle yalnızca bununla oluşturulmuş etiketlerde çalışırlar. Bir etiketin `tag_id` değeri yoksa, yukarıdaki tüm dizi `PUT /campaigns/{campaignId}` ile değiştirin.

```bash
curl -X PUT "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/tags/tag_abc123?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "tag": { "name": "hot-lead", "description": "Updated instruction." } }'
```

Kampanyada olmayan bir `tagId`, `"Tag not found in campaign tags"` ile `404` döndürür.

---

## Bir kampanyanın kanallarını değiştirme

`POST /campaigns/{campaignId}/channels`

Kampanyanın `enabled_channels` dizisindeki kanalları, dizinin tamamını yeniden göndermeden ekler veya kaldırır — başka bir işlem aynı anda kampanyayı düzenliyor olabileceğinde [`PUT /campaigns/{campaignId}`](#update-a-campaign) kullanmaktan daha güvenlidir.

Tek bir geçiş veya toplu işlem gönderin — aynı istekte her ikisini birden göndermeyin:

```json
{ "channel": "whatsapp", "action": "add" }
```

```json
{ "add": ["whatsapp", "instagram"], "remove": ["sms"] }
```

| Alan | Açıklama |
|---|---|
| `channel` | Değiştirilecek bir kanal. `action` ile eşleştirin. |
| `action` | `"add"` veya `"remove"`. `channel` ile eşleştirin. |
| `add` | Eklenecek kanallar dizisi. Toplu form — `channel`/`action` yerine kullanın. |
| `remove` | Kaldırılacak kanallar dizisi. Toplu form. |

Geçerli kanallar: `whatsapp`, `whatsapp_web`, `sms`, `instagram`, `messenger`, `facebook`, `chat_widget`, `custom_channel`, `imessage`, `telegram`, `instagram_private`, `line`, `viber`, `tiktok`, `email`, `linkedin`, `skool`.

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/channels?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "channel": "whatsapp", "action": "add" }'
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "added": ["whatsapp"],
  "removed": []
}
```

> Bu yalnızca kampanyanın hangi kanallarda reklam yapacağını değiştirir — bir kanalı kimin yanıtlayacağına karar vermez. Bunun için yukarıdaki [Kampanya türleri](#campaign-types) bölümüne ve aşağıdaki [Bir kampanyayı gelen kanallara yönlendirme](#route-a-campaign-to-incoming-channels) bölümüne bakın.

---

## Yorumdan DM'e (Instagram ve Facebook)

Yorumdan DM'e özelliği, gönderilerinizden birine yapılan bir yorumu özel bir sohbete dönüştürür: birisi yorum yapar, bot onlara bir DM gönderir ve kampanya sohbeti oradan devralır. Tamamen kampanya nesnesi üzerinden yapılandırıldığından, bunun kullanıcı arayüzüne özgü bir yanı yoktur.

Önce Facebook Sayfasını bağlayın — bkz. [Kanal Bağlantısı](channels.md#instagram--messenger-meta). Ardından aşağıdaki alanları [`PUT /campaigns/{campaignId}`](#update-a-campaign) ile ayarlayın.

> **Kampanya `Live` olmalıdır.** Yorum izleme yalnızca `status` değeri `Live` olan kampanyaları alır (büyük/küçük harf duyarlı değildir — bkz. [Kampanya türleri](#campaign-types)). Başka herhangi bir durum onu sessizce devre dışı bırakır ve `"Active"` gibi uydurma bir durum artık saklanmak yerine bir `400` ile reddedilir. Geçerli durumlar arasında `Draft`, `Pending Approval`, `Scheduled`, `Live`, `Paused`, `Completed`, `Sent` ve `Failed` bulunur.

**Alanlar**

| Alan | Tür | Açıklama |
|---|---|---|
| `monitor_instagram_posts` | boolean | Bağlı sayfadaki her Instagram gönderisini izle. |
| `instagram_post_ids` | string[] | Yalnızca bu Instagram gönderilerini izle. `monitor_instagram_posts` açıkken boş bırakın. |
| `instagram_comment_delay_minutes` | number | DM göndermeden önce yorumdan sonra beklenecek dakika sayısı. |
| `monitor_facebook_posts` | boolean | Bağlı sayfadaki her Facebook gönderisini izle. |
| `facebook_post_ids` | string[] | Yalnızca bu Facebook gönderilerini izle. |
| `facebook_comment_delay_minutes` | number | DM öncesi gecikme (dakika cinsinden). |
| `public_comment_reply_instructions` | string | Yorumun kendisine bırakılan görünür yanıt için rehberlik. Varsayılan "DM'lerinizi kontrol edin" ifadesini geçersiz kılar. |
| `first_response_mode` | string | `"ai"` (varsayılan) ilk DM'yi ve herkese açık yanıtı oluşturur. `"exact_text"`, AI üretimi ve kredi ücreti olmadan, ifadenizi olduğu gibi gönderir. |
| `first_response_exact_text` | string | `first_response_mode`, `"exact_text"` olduğunda kullanılan, olduğu gibi gönderilecek ilk DM. Bu modun etkili olması için gereklidir. |
| `first_response_exact_text_variants` | string[] | İlk DM için ek ifadeler. Gönderim başına rastgele bir tane seçilir, böylece tekrarlanan DM'ler bayt olarak aynı olmaz. |
| `public_comment_reply_exact_text` | string | `"exact_text"` modundaki herkese açık yanıtın aynısı. Herkese açık yanıtı atlamak ve yalnızca DM göndermek için boş bırakın. |
| `public_comment_reply_exact_text_variants` | string[] | Herkese açık yanıt için ek ifadeler. |
| `monitor_instagram_followers` | boolean | Yeni bir takipçiyi tetikleyici olarak kabul et ve bir açılış DM'si gönder (Instagram kişisel hesapları). |
| `follower_outreach_instructions` | string | Yeni takipçi açılış DM'si için rehberlik. |
| `respond_to_instagram_story_replies` | boolean | AI'nın Instagram Hikayelerinize gelen yanıtlara cevap verip vermeyeceği. Varsayılan `true`. Hikaye yanıtlarının AI yanıtı olmadan (Hikaye ekli şekilde) sohbete düşmesi için `false` ayarını yapın. Canlı ayar — taslağın bir parçası değildir, bu nedenle yayınlanması gerekmez. |

**Bir alanı temizleme**

Bu alanlar, `null` gönderdiğinizde `null` olarak ayarlanmak yerine kaldırılır, böylece bot varsayılanlarına geri döner: `instagram_post_ids`, `facebook_post_ids`, `instagram_comment_delay_minutes`, `facebook_comment_delay_minutes`, `public_comment_reply_instructions`, `follower_outreach_instructions`, `first_response_exact_text`, `first_response_exact_text_variants`, `public_comment_reply_exact_text`, `public_comment_reply_exact_text_variants`.

> **Bilinmeyen bir anahtar tüm isteği reddeder.** `PUT /campaigns/{campaignId}`, tüm gövdeyi bir izin listesine göre doğrular. Tanınmayan bir anahtar, isteğin tamamı için `400` döndürür; sessizce göz ardı edilmez ve o gövdedeki diğer alanların hiçbiri yazılmaz.

**cURL**

```bash
curl -X PUT "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "Live",
    "monitor_instagram_posts": true,
    "instagram_comment_delay_minutes": 2,
    "first_response_mode": "exact_text",
    "first_response_exact_text": "Hey! Sending the details over now.",
    "first_response_exact_text_variants": [
      "Hi there, here are the details you asked for.",
      "Thanks for commenting, here is what you need."
    ],
    "public_comment_reply_exact_text": "Just sent you a DM."
  }'
```

**JavaScript**

```javascript
const res = await fetch(
  "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
  {
    method: "PUT",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      status: "Live",
      monitor_instagram_posts: true,
      instagram_comment_delay_minutes: 2,
      first_response_mode: "ai",
      public_comment_reply_instructions:
        "Tell them to check their message requests folder too.",
    }),
  }
);
const data = await res.json();
```

**Python**

```python
import requests

res = requests.put(
    "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "status": "Live",
        "monitor_facebook_posts": True,
        "facebook_post_ids": None,
        "facebook_comment_delay_minutes": 5,
    },
)
data = res.json()
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}
```

> Yorumda bırakılan görünür yanıt, planınızda yorum yanıtlama özelliğinin olmasını gerektirir. Bu özellik olmadan DM yine de gönderilir ancak herkese açık yanıt atlanır.

---

## Bir kampanyayı yapay zeka ile optimize etme

`POST /campaigns/{campaignId}/optimize`

Kontrol panelindeki Optimize et ve beğenmeme geri bildirim akışlarıyla aynı yapay zeka yeniden yazma işlemini çalıştırır: geri bildiriminizi alır, botun talimatlarını yeniden yazar ve sonucu incelemeniz için yeni bir taslak revizyon olarak hazırlar.

| Alan | Gerekli | Açıklama |
|---|---|---|
| `user_feedback` | Bu ikisinden biri gerekli | Nelerin iyileştirileceğini açıklayan serbest biçimli geri bildirim. |
| `thumbs_down_feedback` | Bu ikisinden biri gerekli | Belirli bir bot yanıtına verilen beğenmeme geri bildiriminden alınan geri bildirim. |
| `thumbs_down_message` | Hayır | Beğenmeme geri bildiriminin atıfta bulunduğu bot mesajı. |

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/optimize?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "user_feedback": "Make the tone more casual and mention the free trial earlier." }'
```

**Yanıt** (`202` — yeniden yazma işlemi arka planda çalışır)

```json
{ "success": true, "campaign_id": "NBCXrhqGPSFsd6MV7pRo" }
```

[`GET /campaigns/{campaignId}`](#get-a-campaign) anketini yapın ve `test_bot.status`'i izleyin: hemen `"Optimizing"` durumuna geçer, ardından yeniden yazma işlemi `test_bot`'e ulaştığında tekrar `"Draft"` durumuna döner. Buradan itibaren herhangi bir kontrol paneli taslağı gibi davranır; inceleyin ve ardından canlıya almak için kontrol panelinde yayınlayın. `409`, bu kampanya için halihazırda bir optimizasyonun çalıştığı anlamına gelir.

> Optimizasyon, hesabınızdaki diğer tüm yapay zeka işlemlerinde olduğu gibi kredi harcar.

---

## Bir kişiyi kampanyaya atama

`POST /campaigns/{campaignId}/contacts/{contactId}/assign`

Mevcut bir kişiyi bir kampanyaya dahil eder ve talep etmeniz durumunda kampanyanın açılış mesajını hemen gönderir. Bir kampanyanın onaylı WhatsApp şablonunu bir kişiye göndermenin yolu budur: Bir kampanyanın onaylandığı şablon o kampanyaya aittir, bu nedenle [Templates API](templates.md) kütüphanesinde görünmez ve `/whatsapp-templates/send` aracılığıyla gönderilemez.

| Alan | Zorunlu | Açıklama |
|---|---|---|
| `sendOpeningMessage` | Hayır | `true`, kişi atandığı anda kampanyanın açılış mesajını (WhatsApp kampanyasındaki onaylı WhatsApp şablonu) gönderir. Varsayılan değer `false`'dir. |
| `triggerAIResponse` | Hayır | `true`, yapay zekanın kendi ilk mesajını yazmasına olanak tanır. Varsayılan değer `false`'tir. |

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/contacts/contact_abc123/assign?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "sendOpeningMessage": true }'
```

**Yanıt**

```json
{
  "success": true,
  "data": { "contactId": "contact_abc123", "campaignId": "NBCXrhqGPSFsd6MV7pRo" }
}
```

> **Krediler:** Bir WhatsApp kampanyasında açılış mesajı göndermek, alıcının ülkesine ve şablonun kategorisine göre fiyatlandırılan herhangi bir şablon gönderimi gibi ücretlendirilir. Diğer kanallarda açılış mesajı normal bir giden mesajdır.

---

## Bir kampanyayı gelen kanallara yönlendirme

Bu uç noktalar, bir kampanyanın bir kanaldaki yeni ve bilinmeyen kişilere nasıl yanıt vereceğini yönetir. Yeni entegrasyonlar için **Giriş Noktalarını Tercih Edin** ([Kampanya türleri](#campaign-types) altındaki nota bakın) — bunlar, eski yöntemle yönlendirme yapan kampanyalarla çalışmak ve iki gelen kampanya arasındaki kanal sahipliği çakışmasını çözmek için yararlı olmaya devam eder.

### Bir kampanyayı gelen kanallara atama

`POST /campaigns/{campaignId}/incoming-routing`

| Alan | Gerekli | Açıklama |
|---|---|---|
| `channels` | Evet | Bu kampanyanın yeni ve bilinmeyen kişiler için yanıt vermesi gereken kanalların dizisi. |

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/incoming-routing?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "channels": ["whatsapp", "instagram"] }'
```

**Yanıt**

```json
{
  "success": true,
  "uid": "abc123",
  "campaignId": "NBCXrhqGPSFsd6MV7pRo",
  "channels": ["whatsapp", "instagram"],
  "failed": []
}
```

`channels` yalnızca bu kampanyaya yönlendirilen kanalları listeler; `failed` ise yönlendirilmeyenleri listeler. İstenen her kanal başarısız olursa, isteğin kendisi de başarısız olur.

### Bir kampanyanın gelen yönlendirmesini temizleme

`DELETE /campaigns/{campaignId}/incoming-routing`

| Alan | Gerekli | Açıklama |
|---|---|---|
| `channelToUnassign` | Hayır | Yalnızca bu kanal için yönlendirmeyi temizleyin. Bu kampanyanın şu anda yanıt verdiği tüm kanalları temizlemek için boş bırakın. |

```bash
curl -X DELETE "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/incoming-routing?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "channelToUnassign": "instagram" }'
```

**Yanıt**

```json
{
  "success": true,
  "uid": "abc123",
  "campaignId": "NBCXrhqGPSFsd6MV7pRo",
  "channelsRemoved": ["instagram"]
}
```

### Uyuyan bir kampanyayı yeniden etkinleştirme

`POST /campaigns/{campaignId}/reactivate`

Bir kampanyayı `Ended`, `Completed`, `Paused` veya `Draft` durumundan geri getirir ve kanallarını yeniden talep eder. Yalnızca `Incoming from Unknown Contacts` veya `Combined` durumundaki kampanyalarda çalışır; zaten `Live` olan bir kampanya başarılı kabul edilir ve yapılacak bir işlem yoktur.

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/reactivate?apiKey=YOUR_API_KEY"
```

**Yanıt**

```json
{
  "success": true,
  "data": {
    "success": true,
    "channelsReactivated": ["whatsapp"],
    "channelsBlockedByConflict": [],
    "campaignType": "Incoming from Unknown Contacts"
  }
}
```

Farklı bir kampanyanın temsilcisi tarafından halihazırda talep edilmiş bir kanal, tüm çağrıyı başarısız kılmak yerine `channelsBlockedByConflict` içinde görünür; bu kampanyanın kanalı devralmasını istiyorsanız, önce kanalı serbest bırakmak için aşağıdaki [çakışan bir gelen kampanyayı durdur](#stop-a-conflicting-incoming-campaign) seçeneğini kullanın. Yeniden etkinleştirmeyi desteklemeyen bir kampanya türü veya yukarıdaki uyku durumlarından biri olmayan bir durum için `400` döndürülür.

### Çakışan bir gelen kampanyayı durdur

`POST /campaigns/{campaignId}/stop-incoming`

Bu kampanyanın kanallarını, şu anda onları elinde tutan DİĞER kampanyadan serbest bırakır, böylece bu kampanya onları bir sonraki adımda talep edebilir. Bu, bir gelen kampanyayı başka birinin zaten yanıtladığı bir kanala başlattığınızda kontrol panelinin otomatik olarak yaptığı işlemin REST sürümüdür.

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/stop-incoming?apiKey=YOUR_API_KEY"
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "ended_campaign_ids": [],
  "released_channels": ["whatsapp"],
  "cleared_entire_field": false
}
```

Bu kampanya reklamını yaptığı her kanala zaten sahip olduğunda `released_channels` boş döner; devralınacak bir şey yoktur.

---

## Maliyet tahminleri

Bir kampanyayı göndermeden önce başlatmanın ne kadara mal olacağını tahmin edin.

### WhatsApp şablonu maliyet tahmini

`GET /campaigns/{campaignId}/template-cost-estimate`

```bash
curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/template-cost-estimate?apiKey=YOUR_API_KEY"
```

**Yanıt**

```json
{
  "success": true,
  "billing_mode": "credits",
  "data": {
    "countries": [
      {
        "countryCode": "1",
        "name": "United States",
        "iso": "US",
        "flag": "🇺🇸",
        "contactCount": 120,
        "costPerContact": 2,
        "subtotal": 240
      }
    ],
    "totalContacts": 120,
    "totalTemplateCost": 240,
    "templateCategory": "marketing",
    "billing_mode": "credits",
    "service_messages_billable_soon": false
  }
}
```

`billing_mode`, yönetilen WhatsApp hattında `"credits"`'dir. Meta'nın WhatsApp İşletme Hesabınızı doğrudan faturalandırdığı bir hatta, `costPerContact`, `subtotal` ve `totalTemplateCost` değerleri `null` olarak döner; bildirilecek bir kredi rakamı olmadığından asla ücretsiz olarak okunacak `0` değeri dönmez.

### SMS maliyet tahmini

`GET /campaigns/{campaignId}/sms-cost-estimate`

```bash
curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/sms-cost-estimate?apiKey=YOUR_API_KEY"
```

**Yanıt**

```json
{
  "success": true,
  "billing_mode": "twilio_direct",
  "data": {
    "totalContacts": 120,
    "messageLength": 87,
    "segmentsPerMessage": 1,
    "totalSegments": 120,
    "estimatedCostUsd": 0.96,
    "priceUnit": "USD per segment",
    "billedByTwilio": true
  }
}
```

SMS her zaman kendi Twilio hesabınız üzerinden gönderilir (bkz. [SMS sağlayıcısı](../settings/sms-provider.md)), bu nedenle bu her zaman doğrudan Twilio tarafından faturalandırılır; `estimatedCostUsd`, bir kredi ücreti değil, bu Twilio faturasının bir tahminidir.

---

## Limit kontrolleri

Başarısız bir gönderimden sonra öğrenmek yerine, başlatmadan önce bir limiti kontrol edin.

### Kampanya kapsamlı kontroller

`GET /campaigns/{campaignId}/limits/ai-credit-messaging` — bu kampanyayı başlatmanın veya planlamanın hesabınızın yapay zeka kredisi mesajlaşma limitini aşıp aşmayacağı.

`GET /campaigns/{campaignId}/limits/messaging` — hesabınızın günlük mesajlaşma limitini aşıp aşmayacağı.

```bash
curl "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/limits/messaging?apiKey=YOUR_API_KEY"
```

**Yanıt** (limit aşılmadı)

```json
{
  "success": true,
  "data": "Campaign is within the daily messaging limit."
}
```

Limit aşıldığında bunun yerine bir `400` döndürülür ve nedeni `error` içinde belirtilir.

### Hesap kapsamlı kontroller

`GET /campaigns/limits/campaigns` — aboneliğinizin aylık kampanya oluşturma limitine ulaşıp ulaşmadığınız.

`GET /campaigns/limits/contacts` — aboneliğinizin kişi limitine ulaşıp ulaşmadığınız.

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

**Yanıt**

```json
{
  "success": true,
  "data": "You can create 3 more campaigns this month."
}
```

---

## Kampanya istatistik toplamları

`GET /campaigns/stats/totals`

Hesabınızdaki her kampanya VE her yapay zeka temsilcisi için, geriye dönük bir pencere üzerinden gönderilen ve yanıtlanan toplamlar — kampanya listesi sayfasında her satırın yanında gösterilen sayıların aynısı, kampanya başına bir istek yerine tek bir çağrıda.

| Sorgu parametresi | Açıklama |
|---|---|
| `days` | Geriye dönük pencerenin boyutu, 1-365 arası. Varsayılan değer 90'dır. |

```bash
curl "https://api.youraiconnector.com/v1/campaigns/stats/totals?days=30&apiKey=YOUR_API_KEY"
```

**Yanıt**

```json
{
  "success": true,
  "byCampaign": {
    "NBCXrhqGPSFsd6MV7pRo": { "sent": 1204, "replied": 318 }
  },
  "byAgent": {
    "agent_abc123": { "sent": 1204, "replied": 318 }
  },
  "windowDays": 30
}
```

`byAgent` kendi başına bir toplamdır, `byCampaign` toplamı değildir — yapay zeka temsilcisi tabanlı bir hesabın trafiği hiçbir kampanyaya bağlı olmayabilir, bu nedenle aksi takdirde burada görünmez olurdu.

---

## Oyun alanında bir kampanyayı test etme

Oyun alanı, gerçek bir kanala veya gerçek bir kişiye dokunmadan bir kampanyanın botuyla sohbet etmenizi sağlar. Bu, kontrol panelinin deneme paneliyle aynı korumalı alandır ve API üzerinden tamamen kullanılabilir.

Akış şöyledir: gizli bir test kişisi oluşturun, bir mesaj gönderin ve ardından botun yanıtı için kampanyayı sorgulayın. Yanıtlar asenkron olarak oluşturulur, bu nedenle yanıt gövdesinde değil, kampanyadaki `test_messages` içinde gelirler.

> **Playground, API maliyet kredileri üzerinden çalışır.** Bir API anahtarı ile başlatılan test konuşması, gerçek bir yanıtta olduğu gibi normal yapay zeka mesajı ücreti üzerinden ücretlendirilir ve kullanım geçmişinizde normal bir giriş olarak görünür. Kontrol panelinden yapılan testler ücretsiz kalmaya devam eder. Aradaki fark kasıtlıdır: bir test çalışması, canlı bir çalışma ile aynı yapay zeka işini yapar, bu nedenle sınırsız bir API playground'u, başkasının hesabına sınırsız yapay zeka çalıştırmanın bir yolu olurdu.

### Adım 1 - Test kişisini oluşturun

`POST /campaigns/{campaignId}/try-out/contact`

Gizli test kişisini oluşturur ve onu kampanyaya bağlar. Tüm gövde alanları isteğe bağlıdır; boş bıraktığınız her şey yerleşik bir örnek kimliğe (John Doe) geri döner.

| Alan | Gerekli | Açıklama |
|---|---|---|
| `first_name` | Hayır | Test kişisinin adı. |
| `last_name` | Hayır | Test kişisinin soyadı. |
| `email` | Hayır | Test kişisinin e-postası. |
| `phone` | Hayır | Test kişisinin telefon numarası. |

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/try-out/contact?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "first_name": "Maria", "last_name": "Lopez" }'
```

**Yanıt**

```json
{
  "success": true,
  "contactId": "8kQx1vNbA2fLpR7d"
}
```

### Adım 2 - Gelen mesajı kaydet

`POST /campaigns/{campaignId}/try-out/messages`

Mesajları test dizisine ekler. Ziyaretçinin mesajını önce buraya gönderin, böylece botun okuduğu konuşma geçmişinde görünür.

| Alan | Gerekli | Açıklama |
|---|---|---|
| `messages` | Evet | Mesaj nesneleri dizisi, istek başına en fazla 200. |
| `messages[].body` | Evet | Mesaj metni. |
| `messages[].direction` | Evet | Ziyaretçi için `"inbound"`, bot için `"outbound"`. |
| `messages[].timestamp` | Hayır | ISO-8601 dizisi veya epoch milisaniyeleri. |
| `messages[].role` | Hayır | İsteğe bağlı rol etiketi. |
| `messages[].name` | Hayır | İsteğe bağlı görünen ad. |
| `ignoreCounter` | Hayır | Tamsayı. Aynı yazma işleminde kampanyanın yoksayma sayacını sıfırlar. |

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/try-out/messages?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [
      {
        "body": "Do you ship to Belgium?",
        "direction": "inbound",
        "timestamp": "2026-07-22T09:30:00Z"
      }
    ]
  }'
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo",
  "appended": 1
}
```

### Adım 3 - Botun yanıt vermesini iste

`POST /campaigns/{campaignId}/try-out/test-message`

Mesajı yapay zeka hattına gönderir. Bot yanıtını fiilen üreten çağrı budur.

| Alan | Gerekli | Açıklama |
|---|---|---|
| `message` | Evet | Ziyaretçinin en son mesaj metni. |

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/try-out/test-message?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "message": "Do you ship to Belgium?" }'
```

**Yanıt**

```json
{
  "success": true,
  "data": "Published"
}
```

`"Published"`, mesajın yapay zeka hattına gittiği anlamına gelir. `"Ignored"`, daha yeni bir test mesajının bunun yerini aldığı anlamına gelir; oyun alanı, gerçek bir konuşmada birinin yazmayı bitirmesinin beklenmesi gibi, son mesajdan yaklaşık dört saniye sonra hızlı bir mesaj dizisini tek bir yanıtta birleştirir. Bu birleştirme penceresi nedeniyle, bu çağrının dönmesi birkaç saniye sürer.

### Adım 4 - Yanıtı oku

`GET /campaigns/{campaignId}`

Botun yanıtı, kampanyanın `test_messages` dizisine eklenir. Yeni bir `outbound` girişi görünene kadar kampanyayı sorgulayın.

```json
{
  "success": true,
  "campaign": {
    "id": "NBCXrhqGPSFsd6MV7pRo",
    "test_messages": [
      { "body": "Do you ship to Belgium?", "direction": "inbound" },
      { "body": "Yes, we ship across the EU.", "direction": "outbound" }
    ]
  }
}
```

### Oyun alanını sıfırla

`POST /campaigns/{campaignId}/try-out/reset`

Tüm korumalı alanı temizler: test kişisini siler, `test_messages` içeriğini temizler ve botun yanıt kilitlerini serbest bırakır. Bunu test çalıştırmaları arasında kullanın.

```bash
curl -X POST "https://api.youraiconnector.com/v1/campaigns/NBCXrhqGPSFsd6MV7pRo/try-out/reset?apiKey=YOUR_API_KEY"
```

**Yanıt**

```json
{
  "success": true,
  "campaign_id": "NBCXrhqGPSFsd6MV7pRo"
}
```

### Diğer oyun alanı uç noktaları

| Uç Nokta | Ne işe yarar |
|---|---|
| `DELETE /campaigns/{campaignId}/try-out/contact` | Yalnızca mevcut test kişisini siler ve bağlantısını kaldırır, `test_messages` içeriğini olduğu gibi bırakır. Hiçbir kişi bağlı olmadığında bile başarılı olur. |
| `POST /campaigns/{campaignId}/try-out/transfer` | Tek bir istekte, mevcut bir konuşma ile önceden doldurulmuş yeni bir oyun alanı başlatır: test kişisini değiştirir ve `test_messages` içeriğinin üzerine yazar. Gövde `first_name`, `last_name`, `messages` (boş olabilir) ve `ignoreCounter` alır. Bunu, hız sınırı kullanımınızı üç katına çıkaran sil-sonra-oluştur-sonra-ekle yöntemine tercih edin. |
| `POST /campaigns/{campaignId}/try-out/messages/replace` | `test_messages` içeriğine ekleme yapmak yerine tamamen üzerine yazar. Bir iş parçacığını kısaltmak veya geri sarmak için kullanın. |
| `POST /campaigns/{campaignId}/try-out/contact/reset-ignore-counter` | Gönderimden sonra yeniden yapma ve tekrarlama akışları için yalnızca test kişisinin yoksayma sayacını sıfırlar. |

---

## Kampanyalar API hataları

Kampanya uç noktaları standart hata zarfını döndürür:

```json
{
  "success": false,
  "error": "Campaign not found"
}
```

| Durum | Bir kampanya uç noktasında gerçekleştiğinde |
|---|---|
| `400` | Gerekli bir alan eksik veya geçersiz (örneğin hatalı bir `type`, boolean olmayan bir `enabled` veya bilinmeyen bir hafta içi anahtarı). Ayrıca, sınırın aşılacağı durumlarda bir [limit kontrolü](#limit-checks) uç noktası tarafından ve desteklemeyen bir kampanya türü veya durumu için [yeniden etkinleştirme](#reactivate-a-dormant-campaign) tarafından döndürülür. |
| `404` | Kampanya bulunamadı — ya mevcut değil ya da başka bir hesaba ait. |
| `409` | Bu kampanya için halihazırda bir [optimizasyon](#optimize-a-campaign-with-ai) çalışıyor. |

Her uç noktanın döndürebileceği ortak kodlar — `401`, `403` (planınız API erişimini içermiyor), `429` (hız sınırı) ve `500` — yeniden deneme rehberliği ile birlikte [Hatalar ve Sayfalandırma](errors-and-pagination.md) bölümünde listelenmiştir.

---

## İlgili

- [Bir kanalı bir kampanyaya yönlendirin](channels.md#route-a-channel-to-a-campaign) — Giriş Noktalarını kullanarak Instagram, WhatsApp veya yanıtlaması gereken herhangi bir kanalı Yapay Zeka Temsilcisine yönlendirin.
- [Yapay zeka ile takip şablonları oluşturun](templates.md#generate-follow-up-templates-with-ai) — Bir kampanyanın WhatsApp takip şablonlarını yazan bir arka plan işi başlatın.
- [SSS API'si](faqs.md) — Kampanyalarınızın kullandığı soru-cevap girişlerini yönetin.
- [API Erişimi](../integrations/api-access.md) — API anahtarınızı oluşturun.
- [Kimlik Doğrulama](authentication.md) — Anahtarınızı iletmenin tüm yolları.
