Yeni bir toplu arama kampanyası oluşturun ve maksimum 10,000 kişiye ulaşın
/api/v1/campaignsYeni bir toplu arama kampanyası oluşturur. Kişi listesini JSON array olarak gönderin.
namezorunluKampanya adı (1-255 karakter)
phoneNumberIdzorunluKullanılacak telefon numarasının ID'si
assistantIdzorunluAramaları gerçekleştirecek asistanın ID'si (yayınlanmış olmalı)
contactszorunluAranacak 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
greetingMessageopsiyonelAsistanı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!"
specialInstructionsopsiyonelAsistana ö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."
metadataopsiyonelKampanyaya eklemek istediğiniz ek meta veriler
maxConcurrentCallsopsiyonelEşzamanlı arama limiti. <code>null</code> veya belirtilmezse plan limiti kullanılır.
maxRetriesopsiyonelBaşarısız aramalar için maksimum yeniden deneme sayısı (1-10). <code>null</code> = sistem varsayılanı (3).
retryIntervalMinsopsiyonelYeniden denemeler arası bekleme süresi (dakika, 1-1440). <code>null</code> = sistem varsayılanı (5).
timezoneopsiyonelArama penceresi için zaman dilimi (IANA formatı, ör: <code>Europe/Istanbul</code>). Varsayılan: <code>Europe/Istanbul</code>.
callWindowStartopsiyonelArama penceresi başlangıç saati (0-23). <code>null</code> = kısıtlama yok. <code>callWindowEnd</code> ile birlikte kullanılmalı.
callWindowEndopsiyonelArama penceresi bitiş saati (0-23). <code>null</code> = kısıtlama yok. Başlangıç saatinden büyük olmalı.
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:
"Merhaba Ahmet, size özel bir teklifimiz var!""Müşterinin son siparişi Laptop. Bakiyesi 500 TL. Üyelik: Gold.""Merhaba Ayşe, size özel bir teklifimiz var!""Müşterinin son siparişi Telefon. Bakiyesi 1200 TL. Üyelik: Standart."{
"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
}
}
}{
"success": false,
"error": {
"message": "Phone number not found or not active",
"code": "PHONE_NUMBER_NOT_FOUND"
}
}{
"success": false,
"error": {
"message": "Assistant must be published before use",
"code": "ASSISTANT_NOT_PUBLISHED"
}
}{
"success": false,
"error": {
"message": "Validation error",
"code": "VALIDATION_ERROR",
"details": [
{
"path": ["contacts", 0, "phoneNumber"],
"message": "Phone number is required"
}
]
}
}PENDING durumunda başlar/start endpoint'ini kullanın{{name}} ve {{key}} placeholder'ları büyük/küçük harf duyarsızdırcallWindowStart ve callWindowEnd birlikte kullanılmalıdırpauseReason: "outside_call_window")pauseReason: "insufficient_credits")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.