Anlık Kampanyaları API ile Tetikleme

Prev Next

Anlık bir kampanya, sizin belirttiğiniz kişileri, sizin belirttiğiniz anda arar. Bir form, bir CRM ya da başka bir sistem SESTEK AgenticCX dış API'sine arama isteği gönderir, kişi kampanyaya katılır ve kampanyanın yapay zeka ajanı onu arar. Tipik örnekler: "müşteri formu az önce doldurdu, hemen arayın" ya da "sipariş iptal edildi, bilgilendirme araması yapın".

Bu makale, Anlık bir kampanyanın API ile baştan sona nasıl tetikleneceğini anlatır: nelere ihtiyacınız olduğunu, nasıl belirteç (token) alacağınızı, isteklerin nasıl gönderileceğini, yanıtların nasıl okunacağını ve her aramanın sonradan nasıl izleneceğini. Kampanyanın kendisini oluşturmak için Kampanya Oluşturma ve Düzenleme ve Yapay Zeka Ajanı Kampanyaları ve Anlık Tetikleme makalelerine bakın.

Başlamadan önce

İhtiyacınız olanNereden gelir
Aktif durumda bir Anlık kampanyaKampanyalar ekranında oluşturulur. Planlı bir kampanya istek kabul edemez, duraklatılmış veya tamamlanmış bir Anlık kampanya da istekleri reddeder
Kampanyanın Kampanya KimliğiKampanya detay sayfasında, başlık bölümünde
Bir client ID ve client secretKiracınız için SESTEK tarafından verilir
API'nin ve belirteç servisinin adresiClient ile birlikte SESTEK tarafından verilir

Bir client yalnızca tek bir kiracıya aittir ve yalnızca o kiracının kampanyalarını görür. İsteklerde kiracı bilgisi göndermezsiniz: kiracı belirteçten okunur.

Anlık bir kampanyanın detay sayfası

Kampanya adının yanındaki Kampanya Kimliği, entegrasyonunuzun kullanacağı numaradır. Kampanyayı yeniden adlandırsanız bile değişmez, bu yüzden adı değil kimliği saklayın. Bir entegrasyonun hâlâ kullandığı Anlık kampanyayı tamamlamayın: tamamlama geri alınamaz ve kimlik çalışmaz hale gelir. Ara vermek için Duraklat'ı kullanın.

cURL komutlarını ekrandan alın

İstekleri sıfırdan yazmak zorunda değilsiniz. Kampanya Kimliği'nin yanındaki </> simgesini seçerek cURL olarak kopyala (ext-api) penceresini açın. Pencere beş kampanya ucunu listeler. Birini seçtiğinizde Kampanya Kimliğiniz yerleştirilmiş cURL komutu panonuza kopyalanır. Erişim belirteci her zaman bir yer tutucudur (<YOUR_ACCESS_TOKEN>): gerçek bir belirteç hiçbir zaman gösterilmez ya da kopyalanmaz. Komutu çalıştırmadan önce açılı parantez içindeki tüm yer tutucuları değiştirin.

cURL olarak kopyala penceresi

Adım 1: Erişim belirteci alın

API, OAuth client credentials akışını kullanır.

POST /connect/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
&client_id=<YOUR_CLIENT_ID>
&client_secret=<YOUR_CLIENT_SECRET>
&scope=AgenticCXExternal

Dönen belirteci her istekte Authorization: Bearer <YOUR_ACCESS_TOKEN> olarak gönderin ve süresi dolana kadar yeniden kullanın.

scope parametresi zorunludur. Verilmezse belirteç hedef kitle (audience) olmadan üretilir, belirteç isteği başarılı görünür ve sonraki her API çağrısı 401 ve The audience 'empty' is invalid mesajıyla başarısız olur.

Adım 2: Arama istekleri gönderin

POST /ext-api/v1/campaign/96/call-requests
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json

{
  "items": [
    {
      "clientReferenceId": "ORDER-2026-0001",
      "contact": {
        "phoneNumber": "+905770000123",
        "name": "Elif Yıldız",
        "email": "elif.yildiz@example.com"
      },
      "locale": "tr-TR",
      "parameters": [
        { "key": "orderId", "value": "A-1001" },
        { "key": "amount", "value": "249.90" }
      ]
    }
  ]
}

Her öğe aranacak bir kişidir.

AlanZorunluKural
itemsEvet1 ile 100 öğe. Daha fazla kişi için birden çok istek gönderin
items[].clientReferenceIdEvetSize ait anahtar, en fazla 128 karakter, kampanya içinde benzersiz. Aşağıdaki referans kimlikleri bölümüne bakın
items[].contact.phoneNumberEvetEn fazla 30 karakter. Uluslararası E.164 biçimine çevrilir. Çevrilemezse yalnızca o öğe reddedilir
items[].contact.nameEvetEn fazla 200 karakter. Yeni bir kişi oluşturulması gerekirse kullanılır
items[].contact.emailHayırGeçerli bir adres, en fazla 256 karakter. Yalnızca yeni oluşturulan kişiye yazılır
items[].localeHayırEn fazla 16 karakter, örneğin tr-TR. Yapay zeka ajanına iletilir
items[].parametersHayırEn fazla 20 anahtar ve değer çifti. Anahtar zorunludur, öğe içinde benzersizdir ve en fazla 64 karakterdir. Değer en fazla 512 karakterdir. Tüm küme ayrıca 4.000 bayta sığmalıdır

parameters, yapay zeka ajanına aramanın bağlamını verir, örneğin bir sipariş numarası ya da randevu tarihi. İki sınır birlikte geçerlidir: 512 karakterlik değerlere sahip yirmi çift 4.000 baytı aşar ve isteğin tamamı 400 ile reddedilir.

Adım 3: Yanıtı okuyun

İstek geçerliyse yanıt her zaman 200 olur ve her öğe kendi sonucunu, gönderdiğiniz sırayla taşır. Sonuçları kayıtlarınızla clientReferenceId üzerinden eşleştirin. Reddedilen bir öğe diğerlerini etkilemez.

{
  "campaignId": 96,
  "groupId": "2f6a8e10-9b4c-4a3d-8e21-0a5b7c9d1e2f",
  "acceptedCount": 1,
  "rejectedCount": 0,
  "results": [
    {
      "id": "8f14e45f-ea8d-4b41-9a2c-7c2b0e1d5a63",
      "clientReferenceId": "ORDER-2026-0001",
      "accepted": true,
      "status": "Queued",
      "nextEligibleAtUtc": null,
      "mergedIntoId": null,
      "rejectionReason": null
    }
  ]
}
statusacceptedAnlamıNe yapmalı
QueuedtrueKişi kampanyaya katıldı ve sıradaki arama buBir şey yapmayın. Arama genellikle yaklaşık 15 saniye içinde başlar
DeferredtrueKabul edildi, ancak çağrı penceresi kapalı. İstek kaybolmaznextEligibleAtUtc aramanın ne zaman yapılabileceğini söyler
MergedtrueBu kişinin zaten bekleyen bir araması vardı, istek ona katıldımergedIntoId, katıldığı isteği gösterir. İkinci bir arama yapılmaz
RejectedfalseKabul edilmedirejectionReason alanını okuyun
rejectionReasonAnlamıYeniden gönderebilir miyim?
ContactPhoneInvalidNumara aranabilecek bir numaraya çevrilemiyorHayır. Aynı numara aynı yanıtı verir. Düzeltilmiş numarayı yeni bir clientReferenceId ile gönderin
AdmissionContendedAynı kişi üzerinde paralel bir işlem çalışıyorduEvet, aynı gövde ve aynı anahtarla
AdmissionFailedİstek kaydedilemedi ve hiçbir şey oluşturulmadıEvet, aynı gövde ve aynı anahtarla

Bir isteğin kabul edilmesi tek başına aramayı başlatmaz. Kampanya motoru isteği, kampanyanın çağrı penceresine, maksimum deneme sayısına ve çağrılar arası bekleme süresine göre yürütür.

Referans kimlikleri ve yeniden denemeler

clientReferenceId sizin tekrar güvenliği (idempotency) anahtarınızdır. Aynı anahtarı yeniden göndermek hiçbir zaman ikinci bir arama oluşturmaz: aynı durumla ilk sonucu geri alırsınız. Bu sayede bağlantı koptuktan sonra tüm gövdeyi, ek bir uzlaştırma yapmadan güvenle yeniden gönderebilirsiniz.

  • Anahtar büyük/küçük harfe duyarlıdır. ORDER-1 ve order-1 iki ayrı anahtardır ve iki arama yapılır. Anahtarları tek bir tutarlı biçimde üretin.
  • /, \, %, ? veya # içeremez, kontrol karakteri içeremez, yalnızca . ya da .. olamaz. Boşluklar ve İngilizce olmayan harfler dahil geri kalan her şeye izin verilir.
  • Anahtarı bir adrese koyarken yüzde işaretiyle kodlayın (percent-encode).
  • Güvence, isteğin saklandığı süre boyunca geçerlidir. Tamamlanmış istekler bir saklama süresinden sonra silinir, bu süre varsayılan olarak 90 gündür. Sonrasında aynı anahtar yeni bir iş sayılır ve yeni bir arama yapabilir. Anahtarları yeniden kullanan bir sistemin, örneğin her yıl tekrarlanan sipariş numaralarının, bunu hesaba katması gerekir.
  • Tekrarlanan isteği yalnızca bir hatadan kurtulmak için kullanın. Bir aramanın durumunu denetlemek için asla kullanmayın: her tekrar bir kayıt yazar. Bunun yerine aşağıdaki izleme uçlarını kullanın.

Tüm istek reddedildiğinde

API, hiçbir öğeyi okumadan önce kampanyayı denetler. Kampanya istek kabul edemiyorsa gövdenin tamamı 422 ile reddedilir.

error.codeAnlamıNe yapmalı
AgenticCX:ExternalApi:CampaignNotFoundKiracınızda bu kimlikte bir kampanya yokKampanya Kimliğini kontrol edin
AgenticCX:ExternalApi:CampaignNotInstantTriggerKampanya Anlık bir kampanya değilKampanyanın tetikleme modunu kontrol edin
AgenticCX:ExternalApi:CampaignNotActiveKampanya duraklatılmış veya tamamlanmışKampanyayı başlatın
AgenticCX:ExternalApi:CampaignOutsideDateWindowKampanya aktif, ancak kendi başlangıç ve bitiş tarihlerinin dışındaKampanyanın tarihlerini kontrol edin

422 sonrasında asla yeni bir clientReferenceId ile yeniden denemeyin. Aynı kişi için iki arama yapılabilecek tek durum budur. Kampanya çalışmaya başladıktan sonra aynı gövdeyi aynı anahtarlarla yeniden gönderin. Duraklatılmış bir kampanya, yalnızca daha önce kabul ettiği anahtarlardan oluşan bir gövdeyi yine yanıtlar, bu yüzden bağlantı koptuktan sonra tekrar göndermek güvenli kalır.

HTTP durumuAnlamı
200İstek işlendi. Öğe düzeyindeki redler gövdenin içindedir
400Gövde ya da sorgu sözleşmeye uymuyor, örneğin eksik bir alan, aşılmış bir sınır veya bilinmeyen bir filtre değeri. İsteği düzeltin, yeniden denemek işe yaramaz
401Belirteç eksik ya da süresi dolmuş veya hedef kitle yanlış. scope=AgenticCXExternal ile yeni belirteç isteyin
403Belirteç geçerli, ancak client bu API'yi çağıramaz. Client'ın rolünü ve kiracısını SESTEK ile kontrol edin
422İstek geçerli ama yapılamıyor. Mesaj metnini değil error.code değerini okuyun

Adım 4: Bir aramayı izleyin

Bir isteğe ne olduğunu görmek için onu referans kimliğiyle sorgulayın.

GET /ext-api/v1/campaign/96/call-requests/ORDER-2026-0001
Authorization: Bearer <YOUR_ACCESS_TOKEN>

Yanıt dört bloktan oluşur.

BlokNe söyler
submittedGönderdiğiniz bilgiler, normalleştirilmiş telefon numarası dahil
acceptanceAPI isteği kabul ederken ne yanıtladı: status, nextEligibleAtUtc, mergedIntoId, rejectionReason
callKampanyanın bu istek için ne yaptığı: state, attemptCount, answered, her denemenin zamanı ve outcome değeri
contactStateKişinin kampanyada şu anda nerede olduğu. Aynı kişi için birden çok istek varsa hepsi aynı contactState değerini görür
call.stateAnlamı
NotStartedKabul edildi, henüz deneme yok. Kabul ile ilk arama arasındaki normal durum. Hata değildir
DialingArama şu anda yapılıyor
CompletedArama kesin bir sonuca ulaştı. answered, açan olup olmadığını söyler
FailedArama kurulamadı
Cancelledİstek reddedildi veya arama iptal edildi

Deneme outcome değeri Answered, NoAnswer, Failed, Cancelled, Dialing, Scheduled veya Unknown değerlerinden biridir. Başarısız bir deneme için errorCode nedeni verir: telefon sisteminin bildirdiği bir kapanma nedeni, örneğin NO_ANSWER veya USER_BUSY, ya da arama hiç yapılamadığında NoActiveOutboundNumber gibi bir yapılandırma nedeni. Yeni neden kodları ortaya çıkabilir, bu yüzden kesin değerlere göre dallanmayın. Bilinmeyen bir kodu başarısız deneme sayın ve metnini günlüğe yazın.

contactState.statusAnlamı
PendingSırada, arama bekleniyor. nextEligibleAtUtc bir sonraki aramanın en erken zamanıdır
WaitingNextWindowÇağrı penceresi kapalı. Pencere açılınca kişi sıraya döner
Reserved veya CallingŞu anda aranıyor
CompletedBitti
MaxAttemptsReachedDeneme hakkı kalmadı
ExcludedKampanyadan çıkarıldı veya istek havuza hiç girmedi

Merged bir isteğin call bloğu boştur, çünkü kendi başına bir arama oluşturmamıştır. Aramayı görmek için mergedIntoId içindeki isteği sorgulayın.

İstekleri listeleyin ve sayın

Çok sayıda isteği izlerken iki uç daha işinize yarar.

UçNe döner
GET /ext-api/v1/campaign/{campaignId}/call-requestsİsteklerin bir sayfası, en yeniden başlayarak
GET /ext-api/v1/campaign/{campaignId}/call-requests-summaryİsteklerin sonuca ve arama durumuna göre sayımı

İkisi de şu filtreleri kabul eder.

ParametreKural
groupIdYanıtı tek bir POST'un dokunduklarıyla sınırlar. groupId, o POST'un yanıtında gelir
startDate, endDateİkisi de dahildir ve ikisi de isteğe bağlıdır. Aramanın zamanına değil, isteğin gönderildiği zamana göre süzer. Saat farkı (offset) içermeyen değer UTC olarak okunur

Liste ayrıca arama durumuna göre süzmek için callState, maxResultCount (1 ile 500, varsayılan 50) ve sayfalama için cursor alır. Bir sayfanın nextCursor değerini bir sonrakinin cursor değeri olarak verin ve bunu opak bir değer sayın. nextCursor değerinin null olması son sayfa demektir. Özet; totalCount, acceptedCount, her durumun ve her arama durumunun sayısını ve iki toplamı döndürür: pendingCount (başlamamış, zamanlanmış veya aranıyor) ve finishedCount (tamamlanmış, başarısız veya iptal edilmiş).

Tipik bir entegrasyon

  1. Bir belirteç alın ve süresi dolana kadar yeniden kullanın.
  2. Kampanya detay sayfasındaki Kampanya Kimliğini yapılandırmanıza kopyalayın.
  3. Olay gerçekleştiğinde en fazla 100 kişilik bir POST gönderin.
  4. Her sonucu saklayın: id, status ve groupId.
  5. Bağlantı koptuktan sonra aynı gövdeyi yeniden gönderin.
  6. Tek bir kişiyi izlemek için isteği clientReferenceId ile okuyun. Bir toplu gönderimi izlemek için groupId ile call-requests-summary kullanın.

Bilmekte fayda var

  • API'deki tüm zamanlar UTC'dir (Utc ile biten alanlar). Hiçbir değer kiracı saat dilimine çevrilmez.
  • Merged bir istek parameters ve locale değerlerini kayıtta tutar, ancak yapay zeka ajanı katıldığı isteğin bağlamını kullanır. Aynı kişiye farklı bir bağlam vermek için ilk arama bitene kadar bekleyin, sonra yeni bir anahtar gönderin.
  • Kişi telefon numarasına göre eşleştirilir. Bu numarada bir kişi zaten varsa o kullanılır ve gönderdiğiniz ad ile e-posta ona yazılmaz. Yalnızca yeni bir kişi oluşturulurken kullanılırlar. Mevcut bir kişiyi değiştirmek için Kişiler ekranlarını kullanın.
  • Kabul edilmiş bir istek hiçbir zaman iptal edilmez ve süresi dolmaz: arama kendi penceresini bekler, deneme sınırında durur ve kampanya duraklatıldığında bekler.
  • Aynı kişinin ne sıklıkla tetiklenebileceğine dair kişi başına bir sınır yoktur. Her seferinde yeni bir clientReferenceId gönderirseniz aynı numara kısa aralıklarla yeniden aranabilir, kampanyanın Çağrılar Arası Bekleme ayarı uygulanmaz ve deneme sayacı her yeni istekle yeniden başlar. Bu konuda uyum sorumlularıyla bir kural belirleyin.
  • Bu makale kampanya uçlarını anlatır. Her alanı içeren tam sözleşme, Teknik Belgeler altındaki External API makalesindedir.