Kampanya Oluştur

Yeni bir toplu arama kampanyası oluşturun ve maksimum 10,000 kişiye ulaşın

Endpoint

POST/api/v1/campaigns

Yeni bir toplu arama kampanyası oluşturur. Kişi listesini JSON array olarak gönderin.

Request Body

namezorunlu

Kampanya adı (1-255 karakter)

phoneNumberIdzorunlu

Kullanılacak telefon numarasının ID'si

assistantIdzorunlu

Aramaları gerçekleştirecek asistanın ID'si (yayınlanmış olmalı)

contactszorunlu

Aranacak kişilerin listesi (minimum 1, maksimum 10,000)

phoneNumber - Telefon numarası (zorunlu)

name - Kişi adı (opsiyonel, <code>greetingMessage</code> içinde <code>{"{{name}}"}</code> ile kullanılabilir)

customData - Özel veri (opsiyonel, JSON object). Bu veriler <code>specialInstructions</code> içinde <code>{"{{key}}"}</code> formatıyla kullanılabilir

greetingMessageopsiyonel

Asistanın karşılama mesajını özelleştirin. <code>{"{{name}}"}</code> kullanarak kişinin adını ekleyebilirsiniz.

Örnek: "Merhaba {{name}}, size özel bir teklifimiz var!"

Sonuç: "Merhaba Ahmet, size özel bir teklifimiz var!"

specialInstructionsopsiyonel

Asistana özel talimatlar ekleyin. <code>customData</code> içindeki değerleri <code>{"{{key}}"}</code> formatıyla kullanabilirsiniz.

Örnek customData: {"lastOrder": "Laptop", "balance": "500"}

Örnek talimat: "Müşterinin son siparişi {{sonSiparis}}. Bakiyesi {{bakiye}} TL."

Sonuç: "Müşterinin son siparişi Laptop. Bakiyesi 500 TL."

metadataopsiyonel

Kampanyaya eklemek istediğiniz ek meta veriler

Gelişmiş Ayarlar

maxConcurrentCallsopsiyonel

Eşzamanlı arama limiti. <code>null</code> veya belirtilmezse plan limiti kullanılır.

maxRetriesopsiyonel

Başarısız aramalar için maksimum yeniden deneme sayısı (1-10). <code>null</code> = sistem varsayılanı (3).

retryIntervalMinsopsiyonel

Yeniden denemeler arası bekleme süresi (dakika, 1-1440). <code>null</code> = sistem varsayılanı (5).

timezoneopsiyonel

Arama penceresi için zaman dilimi (IANA formatı, ör: <code>Europe/Istanbul</code>). Varsayılan: <code>Europe/Istanbul</code>.

callWindowStartopsiyonel

Arama penceresi başlangıç saati (0-23). <code>null</code> = kısıtlama yok. <code>callWindowEnd</code> ile birlikte kullanılmalı.

callWindowEndopsiyonel

Arama penceresi bitiş saati (0-23). <code>null</code> = kısıtlama yok. Başlangıç saatinden büyük olmalı.

Örnek İstek

cURL
curl -X POST "https://api.wespoke.ai/api/v1/campaigns" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Summer Campaign 2025",
    "phoneNumberId": "phone_123abc",
    "assistantId": "asst_456def",
    "contacts": [
      {
        "phoneNumber": "+905551234567",
        "name": "John Smith",
        "customData": {
          "lastOrder": "Laptop",
          "balance": "500",
          "membership": "Gold"
        }
      },
      {
        "phoneNumber": "+905559876543",
        "name": "Jane Doe",
        "customData": {
          "lastOrder": "Phone",
          "balance": "1200",
          "membership": "Standard"
        }
      }
    ],
    "greetingMessage": "Hello {{name}}, we have a special offer for you!",
    "specialInstructions": "Customer's last order is {{lastOrder}}. Balance is {{balance}} TL. Membership: {{membership}}.",
    "metadata": {
      "department": "sales",
      "region": "istanbul"
    },
    "maxConcurrentCalls": 10,
    "maxRetries": 3,
    "retryIntervalMins": 10,
    "timezone": "Europe/Istanbul",
    "callWindowStart": 9,
    "callWindowEnd": 18
  }'

Bu örnekte:

  • Ahmet arandığında: Karşılama "Merhaba Ahmet, size özel bir teklifimiz var!"
  • Ahmet için talimat: "Müşterinin son siparişi Laptop. Bakiyesi 500 TL. Üyelik: Gold."
  • Ayşe arandığında: Karşılama "Merhaba Ayşe, size özel bir teklifimiz var!"
  • Ayşe için talimat: "Müşterinin son siparişi Telefon. Bakiyesi 1200 TL. Üyelik: Standart."
  • Eşzamanlı arama limiti: 10 arama
  • Başarısız aramalar: 3 kez denenecek, 10 dakika aralıkla
  • Arama penceresi: 09:00 - 18:00 (Europe/Istanbul)

Örnek Yanıt

201 Created
{
  "success": true,
  "data": {
    "campaign": {
      "id": "camp_abc123",
      "name": "Summer Campaign 2025",
      "status": "PENDING",
      "phoneNumberId": "phone_123abc",
      "assistantId": "asst_456def",
      "userId": "user_xyz",
      "totalContacts": 2,
      "successfulCalls": 0,
      "failedCalls": 0,
      "pendingCalls": 2,
      "maxConcurrentCalls": 10,
      "maxRetries": 3,
      "retryIntervalMins": 10,
      "timezone": "Europe/Istanbul",
      "callWindowStart": 9,
      "callWindowEnd": 18,
      "pauseReason": null,
      "metadata": {
        "department": "sales",
        "region": "istanbul",
        "greetingMessage": "Hello, we have a special offer for you!",
        "specialInstructions": "If the customer is interested, send details via email."
      },
      "createdAt": "2025-01-20T10:00:00Z",
      "updatedAt": "2025-01-20T10:00:00Z",
      "startedAt": null,
      "completedAt": null
    },
    "statistics": {
      "totalContacts": 2,
      "pendingContacts": 2,
      "successfulCalls": 0,
      "failedCalls": 0,
      "averageCallDuration": null
    }
  }
}

Hata Yanıtları

400 Bad Request

{
  "success": false,
  "error": {
    "message": "Phone number not found or not active",
    "code": "PHONE_NUMBER_NOT_FOUND"
  }
}

400 Bad Request - Asistan Yayınlanmamış

{
  "success": false,
  "error": {
    "message": "Assistant must be published before use",
    "code": "ASSISTANT_NOT_PUBLISHED"
  }
}

400 Bad Request - Validasyon Hatası

{
  "success": false,
  "error": {
    "message": "Validation error",
    "code": "VALIDATION_ERROR",
    "details": [
      {
        "path": ["contacts", 0, "phoneNumber"],
        "message": "Phone number is required"
      }
    ]
  }
}

💡Önemli Notlar

  • Kampanya oluşturulduktan sonra PENDING durumunda başlar
  • Kampanyayı başlatmak için /start endpoint'ini kullanın
  • Telefon numaraları E.164 formatında olmalı (+905551234567)
  • Asistan yayınlanmış (published) durumda olmalı
  • Maksimum 10,000 kişi ekleyebilirsiniz
  • Geçersiz numaralar otomatik olarak filtrelenir
  • {{name}} ve {{key}} placeholder'ları büyük/küçük harf duyarsızdır
  • Eşleşmeyen placeholder'lar otomatik olarak kaldırılır
  • callWindowStart ve callWindowEnd birlikte kullanılmalıdır
  • Arama penceresi dışında kampanya otomatik olarak duraklatılır (pauseReason: "outside_call_window")
  • Yetersiz bakiye durumunda kampanya duraklatılır (pauseReason: "insufficient_credits")

📁CSV Dosyası ile customData

Dashboard üzerinden CSV yüklerken, <code>phone</code> ve <code>name</code> dışındaki tüm sütunlar otomatik olarak <code>customData</code> olarak kaydedilir.

Örnek CSV:

phone,name,lastOrder,balance,membership
+905551234567,John Smith,Laptop,500,Gold
+905559876543,Jane Doe,Phone,1200,Standard

Bu CSV'de <code>sonSiparis</code>, <code>bakiye</code> ve <code>uyelik</code> sütunları otomatik olarak her kişinin <code>customData</code>'sına eklenir.