Sunucu API'si
Sunucu API'si ile sunucunuz destek taleplerini okuyabilir, kapatabilir, raporları alabilir, botu kimlerin göreceğini belirleyebilir ve yayımlanan sürümleri listeleyebilir. Her çağrıda gizli anahtarınız kullanılır.
Tam belirtim openapi.yaml dosyasındadır (OpenAPI 3.1). Bu dosyayı Postman veya Insomnia'ya aktarabilir ya da dosyadan bir istemci oluşturabilirsiniz. Sunucu SDK'ları bu sayfadaki tüm uç noktaları kapsar.
Kimlik doğrulama
Temel adres: https://api.kavchat.com. Gizli anahtarı bearer token olarak gönderin. Anahtar sunucunuzda kalır; tarayıcıya veya uygulamaya asla gönderilmez. Anahtarı yönetim panelindeki Kurulum sayfasından yenileyebilirsiniz.
curl https://api.kavchat.com/v1/server/workspace \
-H "Authorization: Bearer $KAVCHAT_SECRET_KEY" \
-H "Accept-Language: en"Yanıtlar ve hatalar
Her yanıt, success alanı içeren bir JSON nesnesidir. Hatalarda, kodunuzun kontrol edebileceği sabit bir code ve message alanı bulunur. Mesajın dili Accept-Language başlığına göre belirlenir (he, en, ar, ru, es, fr, de, pt, it, tr).
// success
{ "success": true, "data": { ... } }
// error
{ "success": false, "code": "ticket_not_found", "message": "Request not found" }| Durum | Örnek kodlar | Anlamı |
|---|---|---|
| 400 | ticket_status_invalid | Bir parametre veya istek gövdesindeki bir alan geçersiz. |
| 401 | invalid_key | Anahtar eksik, hatalı veya yenilenmiş. |
| 404 | ticket_not_found | Bu çalışma alanında böyle bir destek talebi yok. |
Uç noktalar
| Yöntem ve yol | Açıklama |
|---|---|
GET /v1/server/workspace | Çalışma alanı bilgileri ve açık anahtar |
GET /v1/server/tickets | Yeniden eskiye destek talepleri |
GET /v1/server/tickets/{id} | Görüşme dökümüyle birlikte tek bir destek talebi |
PUT /v1/server/tickets/{id}/status | Destek talebini kapatma veya yeniden açma |
GET /v1/server/reports | Görüşmeler, sonuçlar, ayrılma noktaları ve yanıtsız sorular |
GET /v1/server/settings | Bot ayarları ve hedef kitle |
PUT /v1/server/settings | Botun hedef kitlesini değiştirme |
GET /v1/server/releases | Yayımlanan sürümler |
Çalışma alanı
GET /v1/server/workspace
Çalışma alanı bilgilerini, açık anahtarı ve gizli anahtarın son 4 karakterini (secretKeyHint) döndürür. Anahtarın çalıştığını kontrol etmek için ilk çağrı olarak kullanılabilir.
curl https://api.kavchat.com/v1/server/workspace \
-H "Authorization: Bearer $KAVCHAT_SECRET_KEY" \
-H "Accept-Language: en"{
"success": true,
"data": {
"id": "6718e9a1f0c2a4b5c6d7e8f9",
"name": "Example Store",
"locale": "en",
"defaultCountry": "IL",
"plan": "premium",
"publicKey": "pk_live_Ab12Cd34Ef56Gh78Ij90Kl",
"secretKeyHint": "a1b2",
"webhookUrl": "https://example.com/kavchat/webhook"
}
}Destek talepleri listesi
GET /v1/server/tickets
Sohbetten açılan destek talepleri, yeniden eskiye sıralanır.
| Parametre | Açıklama |
|---|---|
status | open veya closed. Parametre gönderilmezse her ikisi de döndürülür. |
limit | 1 ile 200 arasında, varsayılan değer 50. |
before | Sayfalama için: aldığınız son destek talebinin number değeri. |
curl "https://api.kavchat.com/v1/server/tickets?status=open&limit=50" \
-H "Authorization: Bearer $KAVCHAT_SECRET_KEY"
# next page: pass the number of the last ticket you received
curl "https://api.kavchat.com/v1/server/tickets?status=open&limit=50&before=120" \
-H "Authorization: Bearer $KAVCHAT_SECRET_KEY"{
"success": true,
"data": [
{
"id": "6718f0c2a4b5c6d7e8f90123",
"number": 128,
"status": "open",
"name": "Dana",
"email": "dana@example.com",
"phone": "+972501234567",
"userId": "user_123",
"topicId": "billing",
"topicName": "Billing",
"scriptId": "returns",
"sessionId": "k3J9xQ2mP7aB",
"message": "My refund has not arrived yet.",
"transcript": [
{ "from": "bot", "text": "Hi! How can I help?", "stepId": "start", "at": "2026-10-25T09:14:02.000Z" }
],
"createdAt": "2026-10-25T09:15:40.000Z",
"updatedAt": "2026-10-25T09:15:40.000Z"
}
]
}userId, kullanıcı tanımlandığında sub alanının değerini kimlik belirtecinden alır. phone, E.164 biçimindedir.
Tek bir destek talebi
GET /v1/server/tickets/{id}
Tek bir destek talebini, tam görüşme dökümüyle ve listedeki öğelerle aynı yapıda döndürür. Belirtilen kimlik yoksa ticket_not_found koduyla 404 hatası döndürülür.
curl https://api.kavchat.com/v1/server/tickets/6718f0c2a4b5c6d7e8f90123 \
-H "Authorization: Bearer $KAVCHAT_SECRET_KEY"Kapatma veya yeniden açma
PUT /v1/server/tickets/{id}/status
İstek gövdesi: { "status": "closed" } veya { "status": "open" }. Güncellenmiş destek talebini döndürür.
curl -X PUT https://api.kavchat.com/v1/server/tickets/6718f0c2a4b5c6d7e8f90123/status \
-H "Authorization: Bearer $KAVCHAT_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{ "status": "closed" }'Raporlar
GET /v1/server/reports
Görüşmeleri ve sonuçlarını (open, answered, contact, abandoned), her senaryo için özeti, kullanıcıların ayrıldığı adımları ve botun yanıt bulamadığı soruları gruplandırılmış olarak döndürür. from ve to, ISO 8601 biçiminde tarih ve saat değerleridir. Varsayılan aralık son 30 gündür.
curl "https://api.kavchat.com/v1/server/reports?from=2026-10-01T00:00:00Z&to=2026-10-25T00:00:00Z" \
-H "Authorization: Bearer $KAVCHAT_SECRET_KEY"{
"success": true,
"data": {
"from": "2026-10-01T00:00:00.000Z",
"to": "2026-10-25T00:00:00.000Z",
"totals": { "sessions": 940, "open": 12, "answered": 801, "contact": 64, "abandoned": 63 },
"byScript": [
{ "scriptId": "returns", "name": "Returns", "sessions": 310, "open": 3, "answered": 270, "contact": 22, "abandoned": 15 }
],
"dropOff": [
{ "scriptId": "returns", "scriptName": "Returns", "stepId": "label", "stepText": "Print the return label from...", "count": 9 }
],
"unmatched": [
{ "groupKey": "gift card balance", "sample": "how do I check my gift card balance", "count": 17, "lastAt": "2026-10-24T18:02:11.000Z" }
]
}
}Bot ayarları
GET /v1/server/settings
Hedef kitle, test kullanıcıları listesi ve botun görünümü.
curl https://api.kavchat.com/v1/server/settings \
-H "Authorization: Bearer $KAVCHAT_SECRET_KEY"{
"success": true,
"data": {
"enabled": true,
"audience": "testers",
"testerPhones": ["+972501234567"],
"botName": "Support",
"avatarText": "S",
"avatarImageUrl": null,
"subtitle": "Replies instantly",
"primaryColor": "#2563eb",
"position": "end",
"contactTopics": [{ "id": "billing", "name": "Billing" }]
}
}Hedef kitleyi değiştirme
PUT /v1/server/settings
Burada yalnızca audience (off, testers veya all) ve testerPhones (en fazla 50 telefon numarası) alanlarını değiştirebilirsiniz. Diğer ayarlar yönetim panelinden düzenlenir. Yanıt, GET çağrısında olduğu gibi ayarları içerir.
curl -X PUT https://api.kavchat.com/v1/server/settings \
-H "Authorization: Bearer $KAVCHAT_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{ "audience": "testers", "testerPhones": ["+972501234567"] }'
# open the bot to everyone
curl -X PUT https://api.kavchat.com/v1/server/settings \
-H "Authorization: Bearer $KAVCHAT_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{ "audience": "all" }'Sürümler
GET /v1/server/releases
Yayımlanan son 50 sürümü yeniden eskiye sıralar. restoredFrom alanı, sürüm önceki bir sürümü geri yüklediğinde görünür.
curl https://api.kavchat.com/v1/server/releases \
-H "Authorization: Bearer $KAVCHAT_SECRET_KEY"{
"success": true,
"data": [
{
"version": 7,
"note": "New returns flow",
"publishedAt": "2026-10-20T11:30:00.000Z",
"scripts": [
{ "id": "opening", "kind": "opening", "name": "Welcome" },
{ "id": "returns", "kind": "topic", "name": "Returns" }
]
},
{
"version": 6,
"note": "Restore",
"restoredFrom": 4,
"publishedAt": "2026-10-12T08:05:00.000Z",
"scripts": [{ "id": "opening", "kind": "opening", "name": "Welcome" }]
}
]
}Sunucu SDK'sı ile kullanım
Her SDK'da aynı çağrılar kullanılır. Hatalar, status, code, message ve details alanlarını içeren bir API hatası olarak fırlatılır. Yanıt alınamadığında (timeout veya network_error), status değeri 0 olur.
await kavchat.getWorkspace();
await kavchat.listTickets({ status: 'open', limit: 50, before: 120 });
await kavchat.getTicket(id);
await kavchat.setTicketStatus(id, 'closed');
await kavchat.getReports({ from: new Date('2026-01-01'), to: new Date() });
await kavchat.getSettings();
await kavchat.updateSettings({ audience: 'testers', testerPhones: ['+972501234567'] });
await kavchat.listReleases();kavchat.get_workspace()
kavchat.list_tickets(status="open", limit=50, before=120)
kavchat.get_ticket(ticket_id)
kavchat.set_ticket_status(ticket_id, "closed")
kavchat.get_reports(from_=datetime(2026, 1, 1, tzinfo=timezone.utc), to=datetime.now(timezone.utc))
kavchat.get_settings()
kavchat.update_settings(audience="testers", tester_phones=["+972501234567"])
kavchat.list_releases()$kavchat->getWorkspace();
$kavchat->listTickets(status: 'open', limit: 50, before: 120);
$kavchat->getTicket($id);
$kavchat->setTicketStatus($id, 'closed');
$kavchat->getReports(new DateTimeImmutable('2026-01-01'), new DateTimeImmutable());
$kavchat->getSettings();
$kavchat->updateSettings(audience: 'testers', testerPhones: ['+972501234567']);
$kavchat->listReleases();kavchat.getWorkspace();
kavchat.listTickets(ListTicketsParams.create().status(TicketStatus.OPEN).limit(50).before(120));
kavchat.getTicket(id);
kavchat.setTicketStatus(id, TicketStatus.CLOSED);
kavchat.getReports(Instant.parse("2026-01-01T00:00:00Z"), Instant.now());
kavchat.getSettings();
kavchat.updateSettings(UpdateSettingsParams.create().audience(Audience.TESTERS).testerPhones(List.of("+972501234567")));
kavchat.listReleases();await kavchat.GetWorkspaceAsync();
await kavchat.ListTicketsAsync(new ListTicketsOptions { Status = TicketStatus.Open, Limit = 50, Before = 120 });
await kavchat.GetTicketAsync(id);
await kavchat.SetTicketStatusAsync(id, TicketStatus.Closed);
await kavchat.GetReportsAsync(DateTimeOffset.UtcNow.AddDays(-7), DateTimeOffset.UtcNow);
await kavchat.GetSettingsAsync();
await kavchat.UpdateSettingsAsync(new UpdateSettingsRequest { Audience = Audience.Testers, TesterPhones = ["+972501234567"] });
await kavchat.ListReleasesAsync();client.GetWorkspace(ctx)
client.ListTickets(ctx, kavchat.ListTicketsParams{Status: kavchat.TicketOpen, Limit: 50, Before: 120})
client.GetTicket(ctx, id)
client.SetTicketStatus(ctx, id, kavchat.TicketClosed)
client.GetReports(ctx, kavchat.ReportParams{From: time.Now().AddDate(0, 0, -7)})
client.GetSettings(ctx)
client.UpdateSettings(ctx, kavchat.UpdateSettingsParams{Audience: kavchat.AudienceTesters, TesterPhones: []string{"+972501234567"}})
client.ListReleases(ctx)kavchat.get_workspace
kavchat.list_tickets(status: "open", limit: 50, before: 120)
kavchat.get_ticket(id)
kavchat.set_ticket_status(id, "closed")
kavchat.get_reports(from: Time.now - 7 * 86_400, to: Time.now)
kavchat.get_settings
kavchat.update_settings(audience: "testers", tester_phones: ["+972501234567"])
kavchat.list_releasesİstemci API'si
Widget ve mobil SDK'lar, /v1/client/{publicKey} altında herkese açık ek bir arayüz kullanır: yayımlanan sürümü döndürür, görüşmenin akışını kaydeder ve destek talebi formundan talepler açar. Misafirlere de açıktır ve yalnızca açık anahtar gerektirir. Bu arayüzü kendiniz çağırmanız gerekmez; belirtimin eksiksiz olması için openapi.yaml dosyasında açıklanmıştır.