422 CHANNEL_INACTIVE ile reddedilir. Ayrıntı için Hata kodları sayfasına bakın.
Tüm isteklerde
Authorization: Bearer <access_token> ve X-Tenant: <tenant_id> başlıkları gerekir. Başlıklar için Başlıklar, X-Tenant için Klinikler ve X-Tenant sayfasına bakın.Endpoint özeti
Yol önekinin tamamıhttps://app.flextell.ai/api/v1 şeklindedir. Tabloda yalnızca bu sayfanın konusu olan endpoint’ler yer alır.
Scope ve izin farkı: scope, uygulamanın token’ına verilen erişimdir. İzin, token sahibi kullanıcının klinikteki rolünden gelir. İkisi birden gerekir; eksik olan
403 FORBIDDEN döndürür. Ayrıntı için İzinler ve görünürlük sayfasına bakın.
Nesne modeli
GET /conversations ve GET /conversations/{id} aynı alanları döndürür. Oluşturma, arşivleme ve etiket yanıtları daha kısa bir şekil taşır (aşağıdaki not).
customer nesnesinde şu alanlar bulunur: id, first_name, last_name, phone_number, avatar_url, is_masked, is_lead_stage, lead_id, lead_stage (id, name, next_stage_id; yalnız lead aşamasındaki kişide), erased_at, open_tasks_count, notes_count.
POST /conversations yanıtında yalnızca kişi, kanal ve son mesaj bilgisi gelir. tags, lines, blacklist ve görev/not sayaçları yoktur; unread_count 0’dır. archive, unarchive ve tags yanıtları tags ile archived_by_user_name ekler, ama lines, blacklist ve sayaçları taşımaz.2026-10-12T14:30:00+03:00). Yanıtta X-Timezone başlığı bulunur.
Listeleme ve filtreler
GET /conversations sayfalı bir liste döndürür. Varsayılan sayfa boyutu 15, en fazla 100’dür (per_page). Sayfalama biçimi için Sayfalama sayfasına bakın. Sıralama son mesaj zamanına göredir; en yeni mesajı olan sohbet önce gelir. search varsa önce eşleşme alaka düzeyi sayılır.
Filtreler birlikte uygulanır (VE). Hiçbir filtre görünürlük kapsamını genişletmez. Mantıksal parametreler
true, false, 1 ve 0 kabul eder; geçersiz değer 422 döndürür.
Sohbet oluşturma
POST /conversations için Create:Conversation izni gerekir. Kişiyi üç yoldan biriyle belirtin:
customer_id: var olan bir hasta.lead_id: var olan bir lead.channel_idveaddress: kanal ve adres. Kişi henüz yoksa oluşturulur.
customer_id ve lead_id birlikte gönderilemez. customer_id ve lead_id yoksa channel_id ile address zorunludur.
Yanıt her zaman
201 döner, var olan bir sohbet dönse de.
- Kanal seçimi.
customer_idveyalead_idilechannel_idvermezseniz sunucu kanalı sırayla bulur: hastanın son gelen mesajının kanalı, hastanın varsayılan kanalı, kliniğin varsayılan bildirim kanalı, hastaya ulaşılabilen ilk etkin ve bağlı kanal. WhatsApp gibi telefon kanallarında telefon numarası yeterlidir. Telegram, Instagram ve web sitesinde kişinin bir kimliği ya da o kanalda bir sohbeti olmalıdır. - Tekrar çağrı. Aynı kanal ve normalize edilmiş adres için tekrar çağrı aynı sohbeti ve aynı kişiyi döndürür. Silinmiş sohbet geçmişiyle geri gelir.
- Lead oluşturma.
contact_type=leadile yeni bir adres, etkin pipeline’ın ilk aşamasında yeni bir lead olur. Etkin pipeline yoksa hiçbir şey oluşmaz ve422 LEAD_NO_ACTIVE_PIPELINEdöner.contact_typevermezseniz yeni kişi lead’siz bir hasta olur; API hiçbir zaman örtük lead oluşturmaz. - Kısıt. Çözülen adres başka bir hastanın sohbetine aitse (silinmiş olsa bile)
409 CONVERSATION_ADDRESS_TAKENdöner.
Okundu ve okunmamış
Okunmamış sayısı (unread_count) hastadan gelen ve read_at değeri boş olan mesajları sayar. Bu sayı ekibin tamamı için ortaktır: biriniz sohbeti okundu yaptığında herkes için okunmuş olur.
/open isteği per_page, page, search ve message_type[] parametrelerini kabul eder; bunların ayrıntısı Mesajlar sayfasındadır.
- Bu üç çağrı da müşteriye “görüldü” bilgisi (mavi tik) göndermez.
- Giden mesajlar hiçbir zaman personel işlemiyle okundu olmaz.
- Okundu yapılan her sohbet için bir
ConversationReadolayı yayınlanır. Olaylar için Kanallar ve olaylar sayfasına bakın. /open, silinmiş (imha edilmiş) hastanın sohbetinde de çalışır.
Arşiv, etiket ve dışa aktarma
Arşiv
POST /conversations/{id}/archive ve POST /conversations/{id}/unarchive için Archive:Conversation izni gerekir. Gövde yoktur; yanıt, kısa şekilli sohbet nesnesidir.
- Arşiv durumu klinik genelindedir; kimin arşivlediği
archived_by_user_namealanında görünür. - Hasta yeniden yazarsa sohbet kendiliğinden arşivden çıkar. Kliniğin gönderdiği mesajlar sohbeti arşivde bırakır.
- Zaten arşivdeki sohbeti arşivlemek
422 CONVERSATION_ALREADY_ARCHIVED, arşivde olmayanı çıkarmak422 CONVERSATION_NOT_ARCHIVEDdöndürür.
Etiket
PUT /conversations/{id}/tags sohbetin etiket kümesini tümüyle değiştirir. tags alanı zorunludur ve klinik etiketlerinin kimliklerinden oluşan bir dizidir. Boş dizi ([]) tüm etiketleri kaldırır. ManageTags:Conversation izni, etiket tanımlarını düzenleme yetkisi olmadan ortak etiketleri sohbete atamanızı sağlar.
curl
Dışa aktarma
POST /conversations/{id}/export sohbeti indirilebilir dosya olarak akıtır. Yalnızca o sohbetin mesajları, klinik saat diliminde ve eskiden yeniye sıralı gelir. Dosya adı conversation_{id}_{Ymd_His}.{uzantı} biçimindedir.
JSON çıktısında
conversation, timezone, exported_at, message_count ve messages[] bulunur. Her mesajda id, direction (incoming veya outgoing), sender, type, message ve timestamp alanları vardır. CSV sütunları: id, direction, sender, type, message, timezone, timezone_offset, timestamp.
curl
Silme
DELETE /conversations/{id} sohbeti siler (Delete:Conversation). Silinen sohbet kaydı geri dönüşebilir durumdadır: aynı kişi yeniden yazarsa ya da aynı kanal ve adres için sohbet yeniden oluşturulursa aynı kimlikle, geçmişiyle birlikte geri gelir. Silme yaşam döngüsünün genel kuralları için Silme yaşam döngüsü sayfasına bakın.
Görünürlük
Hangi sohbetleri gördüğünüzüViewAllConversations:Conversation izni belirler.
Görmediğiniz bir sohbetin kimliğini kullanırsanız veya başka bir kliniğin kimliğini verirseniz
404 RESOURCE_NOT_FOUND alırsınız. Bu kural liste, tek kayıt, tüm yazma işlemleri ve read-all için geçerlidir. scope parametresi ve diğer filtreler kapsamı daraltır, genişletmez.
Başkasına atanmış lead’ler
ViewAllConversations:Conversation izni olduğu halde tüm lead’leri görme izni (ViewAllLeads:Lead) olmayan bir Satış Temsilcisi, başka birine atanmış bir lead’in sohbetini görebilir ancak kayıt kısıtlıdır:
customer.is_maskeddeğeritrueolur. Ad ilk iki harfe (Jo••), telefon ve adres son iki hane dışında maskelenir.avatar_urlboş gelir.record_statedeğeri{is_read_only: true, reason_code: "LEAD_NOT_ASSIGNED"}olur.- Her yazma işlemi
403 LEAD_NOT_ASSIGNEDdöndürür./messages,/open,/read,/exportgibi okuma uçları bu kilide takılmaz.
409 CUSTOMER_ERASED döndürür.
Sohbet görünürlüğü gerçek zamanlı kanalları da etkiler; ayrıntı için Kanallar ve olaylar sayfasına bakın.
Hata kodları
Hata yanıtı biçimi ve genel kodlar için Hata kodları sayfasına bakın. Sohbet endpoint’lerine özgü olanlar:402 SUBSCRIPTION_REQUIRED ve 402 ACCESS_RESTRICTED_BY_OVERDUE_PAYMENT yanıtları her sohbet endpoint’i için, okumalar dahil geçerlidir. Bu kilitler Erişim kilitleri sayfasında anlatılır.