Entegrasyon Rehberi
OnlineAsistan, web sitenizdeki ziyaretçilerle önce yapay zekâ asistanı Kont ile konuşur. Ziyaretçi canlı temsilci istediğinde görüşmeyi kendi yazılımınıza aktarabiliriz: size bir webhook göndeririz, temsilciniz kendi ekranından cevap yazar.
Kendi yazılımınızla entegrasyon
Hangi yazılımı kullanıyor olursanız olun (CRM, abone yönetimi, rezervasyon, servis takip) aşağıdaki uçları kendi sisteminizde açarsanız asistanın bütün yetenekleri çalışır: müşteri bulma, kimlik doğrulama, borç/fatura, hizmet durumu, talep kaydı, mesaj gönderimi, kapsama sorgusu. Sözleşme sabittir, panelde uç uç ayar yapmazsınız.
Yön önemli: uçları siz açarsınız, biz çağırırız. Bize toplu veri göndermezsiniz; müşteri sorduğu anda sorarız, siz cevaplarsınız — veri sizde kalır.
Postman koleksiyonunda sözleşme sınamaları hazır: zarf biçimi, alan adları, maskesiz ad-soyad, mükerrer kayıt koruması. Hepsi yeşilse uyumlusunuz. Panelde Ayarlar → API Bağlantısı → Standart API seçip adres ve anahtarlarınızı girmeniz yeterli; tek bağlantı web, WhatsApp ve telefonu birden açar.
1. Akış
- Ziyaretçi sitenizdeki chat balonundan yazar; Kont cevaplar.
- "Temsilciye bağlan" denince
chat.handoffolayı webhook adresinize POST edilir — içinde ziyaretçi bilgisi, tüm görüşme geçmişi ve cevap adresi + anahtarı vardır. - Temsilciniz kendi panelinizden yazar, siz cevabı bizim API'ye POST edersiniz; mesaj ziyaretçinin ekranında anında görünür.
- Devirden sonra ziyaretçinin yazdığı her mesaj size
chat.messageolayıyla iletilir. - Görüşme bitince
/closeucunu çağırırsınız (ya da ziyaretçi kapatır, sizechat.closedgelir).
2. Size gönderdiğimiz istek
Başlıklar:
X-OA-Event: chat.handoff
X-OA-Event-Id: 9f1c... (aynı id iki kez gelebilir — bir kez işleyin)
X-OA-Timestamp: 1785000000
X-OA-Signature: sha256=<hmac>
Gövde:
{
"event": "chat.handoff",
"event_id": "9f1c...",
"sent_at": "2026-08-03T10:00:00+03:00",
"company": { "id": 12, "name": "Örnek Firma" },
"session": {
"id": 481,
"token": "d3f7...",
"channel": "web",
"mode": "pending",
"started_at": "2026-08-03T09:58:12+03:00"
},
"reply": {
"url": "https://onlineasistan.net/api/chat/d3f7.../reply",
"close_url": "https://onlineasistan.net/api/chat/d3f7.../close",
"token": "oa_..."
},
"data": {
"reason": "Ziyaretçi canlı asistan istedi.",
"visitor": { "name": "Ziyaretçi", "verified": false, "subscriber_no": null },
"history": [
{ "role": "assistant", "content": "Merhaba...", "at": "..." },
{ "role": "user", "content": "Temsilciye bağlan", "at": "..." }
]
}
}
3. İmza doğrulama
İmza, timestamp + "." + ham gövde metninin panelinizdeki imza anahtarı ile
HMAC-SHA256'sıdır. 5 dakikadan eski istekleri reddedin.
4. Hazır alıcı kod
Düz PHP (tek dosya)
<?php
$secret = 'whsec_...'; // panelden: imza anahtarı
$body = file_get_contents('php://input');
$ts = $_SERVER['HTTP_X_OA_TIMESTAMP'] ?? '';
$sig = $_SERVER['HTTP_X_OA_SIGNATURE'] ?? '';
if (abs(time() - (int) $ts) > 300) { http_response_code(408); exit; }
$expected = 'sha256=' . hash_hmac('sha256', $ts . '.' . $body, $secret);
if (!hash_equals($expected, $sig)) { http_response_code(401); exit; }
$olay = json_decode($body, true);
// Buraya kendi kaydınızı açın (ticket, sohbet kaydı, bildirim...)
// $olay['reply']['url'] ve $olay['reply']['token'] değerlerini saklayın —
// temsilciniz cevap yazarken bunları kullanacaksınız.
http_response_code(200);
echo json_encode(['ok' => true]);
Laravel
// routes/web.php
Route::post('/onlineasistan/webhook', WebhookController::class)
->withoutMiddleware([\Illuminate\Foundation\Http\Middleware\PreventRequestForgery::class]);
// app/Http/Controllers/WebhookController.php
public function __invoke(Request $request)
{
$ts = (string) $request->header('X-OA-Timestamp');
$body = $request->getContent();
abort_if(abs(time() - (int) $ts) > 300, 408);
$expected = 'sha256=' . hash_hmac('sha256', $ts . '.' . $body, config('services.onlineasistan.secret'));
abort_unless(hash_equals($expected, (string) $request->header('X-OA-Signature')), 401);
$olay = $request->json()->all();
// Aynı olay iki kez gelebilir — event_id ile tekilleştirin
if (WebhookOlay::where('event_id', $olay['event_id'])->exists()) {
return response()->json(['ok' => true]);
}
match ($olay['event']) {
'chat.handoff' => app(SohbetServisi::class)->devralindi($olay),
'chat.message' => app(SohbetServisi::class)->ziyaretciMesaji($olay),
'chat.closed' => app(SohbetServisi::class)->kapandi($olay),
default => null,
};
return response()->json(['ok' => true]);
}
Node.js (Express)
const crypto = require('crypto');
app.post('/onlineasistan/webhook',
express.raw({ type: 'application/json' }),
(req, res) => {
const secret = process.env.OA_SECRET;
const ts = req.get('X-OA-Timestamp') || '';
const sig = req.get('X-OA-Signature') || '';
const body = req.body.toString('utf8');
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return res.sendStatus(408);
const expected = 'sha256=' + crypto.createHmac('sha256', secret)
.update(ts + '.' + body).digest('hex');
if (expected !== sig) return res.sendStatus(401);
const olay = JSON.parse(body);
// ... kendi kaydınızı açın
res.json({ ok: true });
});
5. Temsilcinizin cevap yazması
curl -X POST https://onlineasistan.net/api/chat/{oturum-token}/reply \
-H "Authorization: Bearer oa_..." \
-H "Content-Type: application/json" \
-d '{"message":"Merhaba, size nasıl yardımcı olabilirim?","agent_name":"Ayşe"}'
Diğer uçlar:
GET /api/chat/{token}— görüşmenin tüm geçmişi ve durumu (kendi ekranınızı beslemek için).POST /api/chat/{token}/close— görüşmeyi kapatır; isteğe bağlımessagealanıyla veda mesajı.
6. Widget'ı sitenize ekleme
<script src="https://onlineasistan.net/widget.js" data-key="FIRMA_ANAHTARINIZ" async></script>
Anahtarınızı ve izinli alan adlarını panelden yönetirsiniz. Güvenlik için izinli alan adı listesini doldurmanızı öneririz; böylece anahtarınız başka sitede çalışmaz.
7. Teslim garantisi
Sisteminiz geçici olarak cevap veremezse olayı 1 dk, 5 dk, 15 dk ve 1 saat sonra yeniden göndeririz. Tüm gönderimler panelinizdeki Entegrasyon sayfasında listelenir. İsteğinizi 2xx ile yanıtlayın; başka bir kod başarısızlık sayılır.
8. Kont'un kendi sisteminizden bilgi çekmesi (Veri API'si)
Ziyaretçi "borcum ne kadar?", "siparişim nerede?" diye sorduğunda Kont'un tahmin etmemesi, sizin sisteminizden gerçek bilgiyi alması gerekir. Bunun için kod yazmanıza gerek yok: panelden API adresinizi, anahtarınızı ve Kont'un çağırabileceği uçları tanımlarsınız.
Panel → Veri Bağlantıları → Yeni
- API adresi:
https://sizin-sisteminiz.com/api - Kimlik doğrulama: Bearer token · özel başlık (X-API-Key) · adres parametresi · HTTP Basic · yok
- API anahtarı: şifreli saklanır, hiçbir ekranda ham gösterilmez
Sonra her uç için bir "araç" tanımlarsınız:
Araç adı : siparis_durumu
Ne işe yarar : Sipariş numarasına göre kargo durumunu döndürür
Yöntem : GET
Yol : /siparis/{no}
Parametre : no (Yol, zorunlu) — "Sipariş numarası"
Akış şöyle işler:
Ziyaretçi : "1234 numaralı siparişim nerede?"
Kont : (siparis_durumu aracını no=1234 ile çağırır)
GET https://sizin-sisteminiz.com/api/siparis/1234
Authorization: Bearer <sizin anahtarınız>
Siz : {"durum":"kargoda","kargo_firmasi":"Yurtiçi","takip_no":"YK123456789"}
Kont : "Siparişiniz kargoda, Yurtiçi ile gönderildi. Takip no: YK123456789."
API'nizden beklenenler
- JSON dönün; cevap kısa ve anlamlı olsun (dahili id, html, log alanı göndermeyin).
- Hassas veri döndürmeyin — TC kimlik, kart numarası, şifre. Asistan bunu ziyaretçiye okuyabilir.
- Yetkisizde 401, bulunamayanda 404 dönün; Kont bunu "bilgi bulunamadı" olarak yorumlar.
- Yanıt süresi 15 saniyeyi geçmesin.
- Bize verdiğiniz anahtarı yalnız okuma yetkili ayrı bir anahtar yapın; panelden istediğiniz an değiştirin.
KVKK
Kimliği doğrulanmamış ziyaretçiye borç/fatura gibi kişisel bilgi döndürmeyin. Ya API'niz doğrulama bilgisi istesin (abone no + doğum tarihi gibi), ya da önce bir "kimlik doğrula" aracı tanımlayın; Kont o başarılı olmadan diğer uçları çağırmasın.
9. Görüşmeleri kendi ekranınıza çekme (Panel API'si)
Devir (madde 2) tek bir görüşmeyi size iterken, bu API görüşmelerin tamamını okumanızı sağlar: WhatsApp ve web sohbeti aynı listede, dökümleriyle birlikte. Kendi yazılımınızda bir "canlı destek" ekranı kurmak isteyen firmalar bunu kullanıyor.
Kimlik: Authorization: Bearer <entegrasyon jetonu>
(panelden alınır). Tüm uçlar /api/entegrasyon altında.
| Uç | Ne yapar |
|---|---|
GET /gorusmeler |
Görüşme listesi. ?kanal=whatsapp ya da ?kanal=web
ile süzülür; her satırda kanal, mod (bot/bekliyor/temsilci), ad, telefon,
mesaj sayısı, son hareket |
GET /gorusmeler/{id} |
O görüşmenin tam dökümü |
POST /gorusmeler/{id}/cevap |
Temsilciniz kendi ekranından yazar; mesaj müşteriye gider |
GET /gorusmeler/{id}/dosya/{mesaj} |
Görüşmedeki ek (fotoğraf, belge) — içerik doğrudan akıtılır |
GET /whatsapp/durum |
Numara bağlı mı, asistan açık mı |
GET /whatsapp/qr · POST /whatsapp/baglanti |
WhatsApp numarasını kendi ekranınızdan bağlatın |
POST /whatsapp/gonder |
Kendi sisteminizden WhatsApp mesajı gönderin |
POST /whatsapp/asistan |
Asistanı açıp kapatın (nöbet devri) |
GET /geri-donusler |
Asistanın aldığı geri arama talepleri; /kapat ile kapatılır |
POST /cagri-baslat |
Kendi ekranınızdan giden sesli arama başlatın |
Grup görüşmeleri varsayılan olarak gelmez — cevaplanamadıkları için
canlı destek ekranında yanıltıcı olurlar. Gerekiyorsa ?gruplar=1 (hepsi)
ya da ?gruplar=yalniz (yalnız gruplar) ile çekilir; yanıttaki
grup bayrağı ayırır.
curl -H "Authorization: Bearer $JETON" \
"https://onlineasistan.net/api/entegrasyon/gorusmeler?kanal=whatsapp&limit=20"
{"ok":true,"gorusmeler":[
{"id":184,"kanal":"whatsapp","grup":false,"mod":"bot","ad":"Mehmet Y.",
"telefon":"905xxxxxxxxx","abone_no":"7845...","dogrulanmis":true,
"mesaj_sayisi":6,"son_hareket":"2026-08-13T21:14:08+03:00"}]}
Bu API şu an canlıda kullanılıyor: bir dış ürün görüşme ekranını, WhatsApp bağlantısını ve geri dönüş listesini tamamen kendi panelinden yönetiyor.
10. Hazır örnek dosyalar
Depodaki ornekler/ klasöründe kopyala-yapıştır hazır dosyalar var:
1-web-sitesi/— siteye eklenecek kod; WordPress, Shopify, Wix, React ve Laravel için ayrı anlatım2-kendi-yazilimi/— webhook alıcısı ve temsilci cevap kodu: düz PHP, Laravel (controller + servis), Node.js3-veri-apisi/— Kont'un çağıracağı API'nin nasıl görünmesi gerektiği + çalışan örnek4-saglayici-api/— Sağlayıcı API v1 sözleşmesinin çalışan örneği (tek dosya PHP)SAGLAYICI-API.md— sözleşmenin tam metni: her uç, her alan, her hata kodupostman/— koleksiyon + ortam dosyası (uyum sınamalarıyla)