Geliştirici Dokümantasyonu

Kendi yazılımınızı SyBox gelen kutunuza bağlayın

Kendi numaranızdan WhatsApp mesajları gönderin, müşterilerinizin verilerini her sohbetin yanında gösterin, kayıt açın, her olayı kendi sunucunuzda alın ve web sitenize canlı sohbet ekleyin. Gönderim yolu WhatsApp Cloud API biçimini kullanır; bu nedenle Meta için yazılmış kod yalnızca yeni bir temel URL ve bir SyBox anahtarı gerektirir.

Temel URLhttps://api.sybox.io

Başlarken

Hızlı Başlangıç

İlk mesajınızı göndermek için üç şey yeterli: temel URL, cihaz anahtarı ve mesaj uç noktası.

POST/v26.0/{phone-number-id}/messagesAuthorization: Bearer <DEVICE_KEY>

Sürüm bölümü her v<n> biçiminde kabul edilir (v26.0, v1.0, …) — mevcut kodunuz hangisini kullanıyorsa onu koruyun. {phone-number-id}, WhatsApp numaranızın kimliğidir; tıpkı Meta'daki gibi.

{phone-number-id}, Ayarlar › Mesajlaşma › Kanallar bölümünde numaranın kartında id ifadesinden sonra gösterilir. Bir gönderim anahtarı tek bir numaraya bağlıdır ve yalnızca o numaradan gönderir.

cURL
curl -X POST https://api.sybox.io/v26.0/PHONE_NUMBER_ID/messages \
  -H "Authorization: Bearer YOUR_DEVICE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "messaging_product": "whatsapp",
    "to": "15551234567",
    "type": "text",
    "text": { "body": "Hello from SyBox" }
  }'

Ayarlar › Entegrasyonlar › API anahtarları bölümünde her anahtarın kartı, anahtarın en son ne zaman kullanıldığını gösterir — çağrılarınızın ulaşıp ulaşmadığını görmenin en hızlı yolu budur.

Başlarken

Kimlik doğrulama ve anahtarlar

Her çağrı, Authorization başlığında Bearer belirteci olarak bir anahtar taşır. Her anahtarın tek bir görevi vardır: gönderim için oluşturulan bir anahtar kayıt açamaz, kayıt açmak için oluşturulan bir anahtar da gönderim yapamaz. Tüm anahtarları sunucunuzda saklayın — tek istisna, sayfalarınızda durmak üzere tasarlanmış Canlı Sohbet açık anahtarıdır.

HTTP
Authorization: Bearer YOUR_KEY
Content-Type: application/json
AnahtarNe işe yarar
WhatsApp üzerinden gönderPOST /v{n}/{phone-number-id}/messages
Şikayet kaydı açPOST /v1/case
Otomasyon başlatPOST /v1/automation
Kişileri oku ve güncellePOST /v1/contacts/…
Bir programdan alPOST /v1/inbound
Açık anahtar · lcpk_<script … data-key="lcpk_…">
Giriş yapmış kullanıcılar için imzalama anahtarı · lcid_Oturum açmış kullanıcılar: imzalama anahtarı
Sunucu anahtarı (kendi sohbet ekranınız için) · lcsk_/v1/livechat/*
Yanıt imzalama anahtarı · lcwh_x-sybox-signature
İmzalama anahtarıX-Hub-Signature-256

Başlarken

Cihaz anahtarı alma

Anahtarlar çalışma alanınızın içinde oluşturulur.

  1. Çalışma alanınızı açın → Ayarlar → API anahtarları.
  2. Her anahtar tek bir numaraya bağlıdır ve istediğiniz zaman iptal edilebilir.
  3. Gerçek WhatsApp belirteciniz sunucumuzdan asla ayrılmaz.
  4. Ağ geçidi varsayılan olarak kapalıdır.

WhatsApp API

İlk mesajınızı gönderin

Düz metin mesajı. Gövde standart Cloud API verisidir.

POST/v26.0/{phone-number-id}/messagesAuthorization: Bearer <DEVICE_KEY>
curl -X POST https://api.sybox.io/v26.0/PHONE_NUMBER_ID/messages \
  -H "Authorization: Bearer YOUR_DEVICE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "messaging_product": "whatsapp",
    "to": "15551234567",
    "type": "text",
    "text": { "body": "Hello from SyBox" }
  }'

Yanıt

Meta'nın döndürdüğü yanıtı aynı HTTP durumuyla birebir alırsınız.

200 OK · application/json
{
  "messaging_product": "whatsapp",
  "contacts": [{ "input": "15551234567", "wa_id": "15551234567" }],
  "messages": [{ "id": "wamid.HBgLMTU1NTEyMzQ1NjcVAgARGBI…" }]
}

WhatsApp API

Tüm mesaj türleri çalışır

Gövde aynen iletildiği için tüm Cloud API mesaj türleri desteklenir.

{
  "messaging_product": "whatsapp",
  "to": "15551234567",
  "type": "template",
  "template": {
    "name": "order_shipped",
    "language": { "code": "en_US" },
    "components": [{
      "type": "body",
      "parameters": [{ "type": "text", "text": "#10432" }]
    }]
  }
}

Serbest metin, müşteriye yalnızca son mesajından itibaren 24 saat içinde ulaşır. Bu sürenin dışında onaylı bir şablon gönderin: SyBox bu durumda serbest metni, Meta'ya ulaşmadan önce 131047 koduyla reddeder.

WhatsApp API

Anahtar kuralları ve sınırlar

Her gönderim anahtarı, oluştururken belirlediğiniz kendi kurallarını taşır: serbest metin, şablonlar veya ikisi birden; medya olsun ya da olmasın; hangi şablonlar; hangi alıcı ülkeler; gönderim yapabileceği saatler ve günlük bir sınır. Bunlardan birini ihlal eden bir gönderimi SyBox, Meta'ya ulaşmadan önce reddeder.

DurumNe zaman
404Boş bir yanıt: API ağ geçidi kapalı veya anahtar hiçbir çalışma alanına ait değil. Ayarlar › Entegrasyonlar › API anahtarları sayfasının üstündeki anahtarı kontrol edin.
401Anahtar eksik veya tanınmıyor.
403Anahtar bir gönderim anahtarı değil veya bağlı olmadığı bir numaradan gönderim yapıyor.
403Mesaj, anahtarın kurallarından birini ihlal ediyor: serbest metin, şablonlar, medya, şablonun adı, ülke veya saatler.
403Meta şablonu duraklattı veya kalite derecesi nedeniyle sınırladı.
40024 saatlik süre doldu (kod 131047): bunun yerine bir şablon gönderin.
400Gövde geçerli bir JSON değil veya anahtarın WhatsApp numarası artık bağlı değil.
409Meta bu numaranın gönderim yapmasını şimdilik durdurdu.
429Anahtarın günlük sınırına veya numaranın WhatsApp mesajlaşma sınırına ulaşıldı.
502Meta'ya ulaşılamadı. Tekrar deneyin.

Günlük sayaç UTC gece yarısında yeniden başlar ve başarısız olan bir gönderim sayılmaz.

WhatsApp API

Hatalar

Hatalar iki yerden gelir ve ikisi de Meta'nın hata biçimini kullanır; bu nedenle mevcut bir Cloud API istemcisi onları değişiklik yapmadan okur. Meta'dan gelen bir hata, Meta'nın durum koduyla, tam olarak Meta'nın gönderdiği gibi döner. SyBox'un kendi kurallarından birinden gelen bir hatanın type değeri SyBoxGatewayError olur ve message alanı çağrıyı hangi kuralın reddettiğini belirtir.

{
  "error": {
    "message": "(#131030) Recipient phone number not in allowed list",
    "type": "OAuthException",
    "code": 131030
  }
}

Sisteminiz SyBox'ta

Verilerinizi sohbetin yanında gösterin

Bir temsilci sohbeti açtığında SyBox SİZİN uç noktanızı çağırır ve verilerinizi sohbetin yanında gösterir.

Uç noktanızı Ayarlar › Entegrasyonlar › ERP API'leri bölümünde ekleyin. Her çağrı bir POST isteğidir; anahtarınız Authorization içinde, istek ise JSON dizesi taşıyan tek bir alanda, data içinde bulunur — böylece iki taraf da diğerini bozmadan ileride alan ekleyebilir. 15 saniye içinde yanıt verin.

POST YOUR_ERP_URL
Authorization: Bearer YOUR_ERP_KEY
X-Sybox-Action: lookup
X-Sybox-Lang: en
X-Sybox-Theme: light
X-Sybox-Agent: 6f1c…
X-Sybox-Number: 104857600000000
Content-Type: application/json

{ "data": "{\"phone\":\"15551234567\",\"email\":\"customer@example.com\",\"ref\":\"\"}" }

Her çağrı ayrıca kimin sorduğunu da bildirir: X-Sybox-Lang (kullanıcının dili — yanıtı bu dilde verin), X-Sybox-Theme (light veya dark, bir html yanıtı için), X-Sybox-Agent (kullanıcının id'si) ve X-Sybox-Number (sohbetin bulunduğu hat).

Telefon ve e-posta gönderiyoruz — { renderAs, content } ile yanıt verin.

renderAs

SyBox'a içeriği nasıl görüntüleyeceğini bildirmek için renderAs belirleyin:

renderAsAçıklama
tableSatırlar ve sütunlar. content düz nesnelerden oluşan bir dizidir (veya { rows: [ … ] }); bu nesnelerin anahtarları sütun başlıkları olur.
cards · kpiBakiye veya sipariş sayısı gibi küçük kutucuklar. content, { label, value } öğelerinden oluşan bir dizidir (veya { cards: [ … ] }).
feed · list · threadKartlardan oluşan bir zaman akışı. content, { title, text, date, tags, media: [{ type, url, name }] } öğelerinden oluşan bir dizidir.
messageTek bir mesaj kartı biçiminde düzenlenmiş tek bir kayıt.
htmlKendi HTML'iniz, content içinde bir dize olarak. Yalnızca kendi oluşturduğunuz işaretleme için.
sectionsTek yanıtta birden fazla blok: content, { sections: [ { title, renderAs, content } ] } biçimindedir.
jsonrenderAs belirtilmediğinde varsayılan budur: SyBox content değerinizi biçimlendirilmiş JSON olarak gösterir.

Herhangi bir tablo satırına sybox_ref ekleyerek tıklanabilir yapın.

Ürün arama (X-Sybox-Action: products)

Aynı uç nokta ürün aramalarını da yanıtlayabilir. Kullanıcı müşterinin istediği ürünü yazar, SyBox bunu "q" olarak gönderir ve yanıtınız sohbetin yanında ürün kartları olarak gösterilir — tek dokunuşla Gönder özelliği sayesinde ürün bağlantısını mesaj alanına ekler.

POST YOUR_ERP_URL
Authorization: Bearer YOUR_ERP_KEY
X-Sybox-Action: products

# the decoded "data":
{ "q": "wireless keyboard", "phone": "15551234567", "email": "customer@example.com", "ref": "" }
AlanAçıklama
namezorunluTek zorunlu alan. Yalnızca adı olan bir ürün de derli toplu bir kart olur.
price · oldPrice · currencyBiçimlendirilmiş metin değil, sayı gönderin. oldPrice'ı yalnızca gerçek bir önceki fiyat varsa gönderin — indirim ikisinden hesaplanır.
available · stockavailable true/false'tur; stock yanında gösterilen isteğe bağlı bir sayıdır. Stok takibi yapmıyorsanız ikisini de yazmayın — olmayan alan hiçbir şey çizmez ve asla «tükendi» diye okunmaz.
imageDoğrudan bir https görsel adresi. Yüklenemeyen görsel yerine nötr bir zemin gösterilir.
linkÜrün sayfasının adresi. Olmadığında kart yalnızca görüntülenir — Gönder yalnızca gönderilecek bir şey varsa görünür.
noteFiyatın altında kısa ve serbest tek satır — teslim süresi, bir varyant, bir koşul.

Zaten kurduğunuz uç noktadan başkası değil: aynı URL, aynı anahtar, aynı { "data": "…" } zarfı. Ürün aramasını müşteri sorgusundan ayırmak için X-Sybox-Action başlığına bakın. content'i düz bir dizi olarak döndürün (veya { items: [ … ] }).

Sisteminiz SyBox'ta

Kendi sisteminizden kayıt açın

ERP veya muhasebe sisteminizin tek bir destek kaydı açmasını sağlayın.

POST/v1/caseAuthorization: Bearer <CASE_KEY>
curl -X POST https://api.sybox.io/v1/case \
  -H "Authorization: Bearer $SYBOX_CASE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "customer_unique_id": "CUST-10432",
    "header": "Screen replacement not delivered",
    "description": "Paid on 12 Aug, promised in 3 days, still nothing.",
    "department_id": 5,
    "ext_ref": "TICKET-99817"
  }'

Alanlar

AlanAçıklama
customer_unique_idMüşteri için kendi id'niz — müşteri eşitlemesinin kullandığı anahtarın aynısı. id'niz yoksa bunun yerine phone gönderin.
phoneid'niz olmadığında müşterinin telefon numarası.
header · descriptionEn az biri gereklidir. Başlık, kullanıcıların listede gördüğü satırdır.
department_idzorunluintegerZorunlu. Talebin kaydedildiği departman: Ayarlar › Departmanlar bölümünde yanında gösterilen numara (örneğin #5).
ext_refBilet numaranız.
sectioninteger1 ile 4 arası: kaydın hangi sekmeye gideceği. Varsayılan 1.
deadlinestringBir son tarih, YYYY-MM-DD.
notifybooleanVarsayılan true: kayıt numarasını içeren bir not, müşterinin SyBox'taki sohbetinde görünür. Müşteriye hiçbir şey gönderilmez. false notu eklemez.
sourcestringBu notta gösterilen program adı. Varsayılan ERP.

Yanıt, kaydın numarasını taşır; ekibinizin müşteriye ilettiği numara budur. Aynı ext_ref ile yapılan bir yeniden deneme, zaten var olan kayıtla birlikte "duplicate": true yanıtını verir; customer_id bu yanıtta yer almaz.

Müşteri SyBox'ta zaten kayıtlı olmalıdır. id bulunamazsa SyBox sisteminizle bir müşteri eşitlemesi yapar ve tekrar arar; yine bulunamazsa yanıt 404 olur — kayıt asla uydurulmuş bir müşteri adına açılmaz.

'case' türünde bir anahtar kullanın.

Sisteminiz SyBox'ta

Başka bir programdan mesaj aktarın

WhatsApp dışındaki harici sistemlerden (POS, cihaz uyarısı) gelen iletiler için.

POST/v1/inboundAuthorization: Bearer <INBOUND_KEY>

Bu türde anahtar artık oluşturulmuyor: mevcut bir Bir programdan al anahtarı çalışmaya devam eder. Yeni bir entegrasyon için bir kayıt açın — SyBox notu sohbete sizin yerinize yazar.

cURL
curl -X POST https://api.sybox.io/v1/inbound \
  -H "Authorization: Bearer $SYBOX_INBOUND_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "15551234567",
    "text": "Order 4821 has left the warehouse.",
    "source": "Warehouse"
  }'
AlanAçıklama
phonezorunlustringMüşterinin ülke koduyla birlikte telefon numarası.
textzorunlustringMesaj.
sourcestringMesajda gösterilen program adı.

Yanıt {"ok": 1, "id": …} biçimindedir; id, sohbetteki notun kimliğidir.

Tasarım gereği yalnızca içe aktarım içindir.

Sisteminiz SyBox'ta

Kişiler: oku ve güncelle

Kişileri oku ve güncelle türünde bir anahtarla bir program bir kişiyi bulabilir, okuyabilir ve adını, e-postasını, kişi alanlarını ve etiketlerini değiştirebilir. Her çağrı JSON gövdeli bir POST isteğidir.

Anahtar, onu oluşturan kişi adına hareket eder: yalnızca o kişinin görebildiği kişileri ve yalnızca o kişinin kişi listesini açıp numaraları görme izni varsa bulur. Herhangi bir değişiklik yapabilmek için o kişinin kişileri düzenleme iznine sahip olması gerekir. Oluşturan kişinin hesabı kapatıldığında anahtar çalışmayı durdurur.

POST/v1/contacts/searchAuthorization: Bearer <CONTACTS_KEY>

Adı, telefonu veya e-postası q içeren kişileri bulur. limit varsayılan olarak 20, en fazla 50'dir.

POST/v1/contacts/get

Tek bir kişi, phone veya key ile (bir webhook'un gönderdiği contact.key ile aynı).

POST/v1/contacts/update

Yalnızca gönderdiğiniz alanları değiştirir: name, email ve fields (id veya ada göre kişi alanları ve değerleri; boş bir değer alanı temizler).

POST/v1/contacts/labels

Id veya ada göre etiket ekler ve kaldırır: add ve remove birer listedir.

curl -X POST https://api.sybox.io/v1/contacts/update \
  -H "Authorization: Bearer $SYBOX_CONTACTS_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "201112223344",
    "name": "Sara Ali",
    "fields": { "city": "Alexandria" }
  }'

# Find:   POST /v1/contacts/search  {"q": "sara", "limit": 20}
# Read:   POST /v1/contacts/get     {"phone": "201112223344"}
# Labels: POST /v1/contacts/labels  {"phone": "201112223344", "add": ["VIP"], "remove": [7]}

Her çağrı kişiyle yanıt verir (search: bunların bir listesi): key, name, phone, email, channel, labels ve fields.

Olaylar

Webhook'lar: olaylar sunucunuzda

Uç noktanızı Ayarlar › Entegrasyonlar › Web kancaları bölümünde ekleyin, olayları ve numaraları seçin; SyBox her olayı gerçekleştiği anda ona POST eder. Bir WhatsApp olayı Meta'nın kendi webhook biçiminde gelir; bu nedenle Meta için yazılmış bir işleyici değişiklik yapmadan çalışır.

OlayAçıklama
messageGelen mesajBir müşterinin mesajı.
statusMesaj durumuGönderildi, teslim edildi, okundu veya başarısız oldu — gönderdiğiniz bir mesaj için.
reactionTepkiBir müşteri bir mesaja tepki verdi.
doneGörüşme tamamlandı olarak işaretlendiBir görüşme tamamlandı olarak işaretlendi: bir kişi tarafından, bir otomasyon tarafından veya müşterinin sessizliğinden sonra kendiliğinden.
labelEtiket eklendi veya kaldırıldıBir görüşmeye etiket eklendi veya görüşmeden kaldırıldı.
contactKişi oluşturuldu veya güncellendiBir kişi oluşturuldu ya da adı, e-postası veya kişi alanları değişti.
dealAnlaşma kapatıldıBir görüşmede kapatılan bir anlaşma kaydedildi.
caseCRM kaydı açıldı veya kapatıldıBir CRM kaydı açıldı veya kapatıldı (çözüldü, çözülmedi veya iptal edildi).
İstek · SyBox → siz
POST YOUR_WEBHOOK_URL
Content-Type: application/json
X-Hub-Signature-256: sha256=5d1f0c…
x-sybox-signature: sha256=5d1f0c…
x-sybox-event: message
x-sybox-timestamp: 1761400000

{
  "object": "whatsapp_business_account",
  "entry": [{
    "id": "WABA_ID",
    "changes": [{
      "field": "messages",
      "value": {
        "messaging_product": "whatsapp",
        "metadata": { "display_phone_number": "15550001111", "phone_number_id": "PHONE_NUMBER_ID" },
        "contacts": [{ "profile": { "name": "Sara" }, "wa_id": "15551234567" }],
        "messages": [{
          "from": "15551234567",
          "id": "wamid.HBgLMTU1NTEyMzQ1NjcVAgASGBQ…",
          "timestamp": "1761400000",
          "type": "text",
          "text": { "body": "Is my order shipped?" }
        }]
      }
    }]
  }]
}

Medya. Meta'nın kendi bağlantısını açmak için bir Meta belirteci gerekir; bu nedenle SyBox onu, dosyanın kendi kopyasına giden ve 24 saat geçerli olan imzalı bir bağlantıyla değiştirir. Webhook istediğinde, bir sesli mesaj metnini sybox.transcription içinde de taşıyabilir.

Diğer kanallar — Messenger, Instagram, Telegram ve Canlı Sohbet — yalnızca mesaj olayı için ve SyBox'un kendi biçiminde gelir:

JSON
{
  "object": "sybox",
  "event": "message",
  "channel": "telegram",
  "line": "8123456789",
  "workspace": "yourworkspace",
  "contact": { "key": "tg:6423115118", "name": "Sara" },
  "message": {
    "id": "812345",
    "timestamp": 1761400000,
    "type": "image",
    "text": "",
    "caption": "The broken part",
    "media": { "url": "https://api.sybox.io/…", "mime": "image/jpeg" }
  }
}

Görüşme olayları her kanal için SyBox'ın kendi biçiminde gelir. event tam olarak ne olduğunu belirtir:

Olay<code>event</code>
Görüşme tamamlandı olarak işaretlendiconversation.done
Etiket eklendi veya kaldırıldılabel.added · label.removed
Kişi oluşturuldu veya güncellendicontact.created · contact.updated
Anlaşma kapatıldıdeal.closed
CRM kaydı açıldı veya kapatıldıcase.opened · case.closed
Test olayıtest
{
  "object": "sybox",
  "event": "conversation.done",
  "channel": "whatsapp",
  "line": "201001234567",
  "workspace": "yourworkspace",
  "timestamp": 1761400000,
  "contact": {
    "key": "201112223344",
    "name": "Sara",
    "phone": "201112223344",
    "email": "",
    "channel": "whatsapp",
    "labels": [{ "id": 3, "name": "VIP" }],
    "fields": [{ "id": 2, "key": "city", "name": "City", "value": "Cairo" }]
  },
  "data": { "by": "Omar", "note": "Refund sent" }
}

İmzalama anahtarı

BaşlıkAçıklama
X-Hub-Signature-256sha256= ve ardından ham gövdenin, webhook'un imzalama sırrıyla anahtarlanmış onaltılık HMAC-SHA256 değeri — Meta'nınkiyle aynı başlık ve yöntem.
x-sybox-signatureAynı değer; böylece Meta'nın kendi çağrılarını da alan bir uç nokta bizimkileri ayırt edebilir.
x-sybox-eventNe oldu: message, status, reaction, aşağıdaki görüşme olaylarından biri (conversation.done, label.added…) veya test.
x-sybox-timestampGönderildiği zaman, Unix saniyesi olarak.
x-sybox-signature-rsaİkinci bir imza: rsa-sha256= ve ardından x-sybox-timestamp, bir nokta ve ham gövdenin base64 biçiminde RSA-SHA256 (PKCS#1 v1.5) değeri.
x-sybox-key-idİmzayı anahtarlarımızdan hangisinin oluşturduğu. Açık anahtar https://api.sybox.io/.well-known/sybox-webhook-key adresindedir.

İmzayı ham baytlar üzerinde, ayrıştırmadan önce kontrol edin ve sabit sürede karşılaştırın:

const crypto = require('crypto');

// express.raw: the signature is over the bytes as sent, so read them before any JSON parser.
app.post('/sybox/webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const sent = Buffer.from(req.get('X-Hub-Signature-256') || '');
  const want = Buffer.from('sha256=' + crypto
    .createHmac('sha256', process.env.SYBOX_WEBHOOK_SECRET)
    .update(req.body)
    .digest('hex'));
  if (sent.length !== want.length || !crypto.timingSafeEqual(sent, want)) return res.sendStatus(401);

  res.sendStatus(200);                       // answer first, then do the work
  const event = JSON.parse(req.body);
  const kind = req.get('x-sybox-event');     // message | status | reaction
});

Sunucunuzda paylaşılan bir sır tutmak istemiyor musunuz? Bunun yerine x-sybox-signature-rsa değerini açık anahtarımızla kontrol edin. Her iki durumda da beş dakikadan eski bir zaman damgasını reddedin.

15 saniye içinde herhangi bir 2xx ile yanıt verin. Bunun dışındaki her şey — bir hata, zaman aşımı, yönlendirme — 1, 2, 4, 8, 16 ve 32 dakika sonra yeniden denenir, ardından bırakılır. Bir olay birden fazla kez gelebilir: tekrarı yok saymak için mesajın id'sini kullanın. Adres herkese açık ve https olmalıdır.

Bir saatten uzun süre boyunca arka arkaya 20 kez başarısız olan bir webhook kendiliğinden kapatılır ve çalışma alanı yöneticisine haber verilir. Bekleyen olayları 24 saat boyunca saklanır: göndermek için tekrar açın.

Test etmek için webhook kartındaki Test olayı gönder düğmesine basın. Aynı karttaki Teslimatlar, sunucunuzun yanıtıyla birlikte son 50 teslimatı listeler ve birini tekrar gönderebilir.

Canlı Sohbet

Canlı Sohbet

Web sitenize bir sohbet ekleyin: ziyaretçiler orada yazar, ekibiniz SyBox'ta yanıtlar. Web sitesini Ayarlar › Mesajlaşma › Kanallar bölümünde, Canlı Sohbet kartından ekleyin; açılan pencere, Siteniz için kod, size kodu ve aşağıdaki anahtarları verir. Üç gizli anahtar yalnızca bir kez gösterilir.

AnahtarBaşlangıcıNe işe yarar
Açık anahtarlcpk_Sayfalarınıza konur. Yayımlamak güvenlidir: yalnızca web sitesini tanımlar ve sohbet yalnızca Web sitesi adresleri listenizdeki adreslerde görünür.
Giriş yapmış kullanıcılar için imzalama anahtarılcid_Yalnızca sunucunuzda. Oturum açmış her kullanıcıyı imzalar; böylece kimse başka biri adına yazamaz.
Sunucu anahtarı (kendi sohbet ekranınız için)lcsk_Yalnızca sunucunuzda. Yalnızca hazır sohbet yerine kendi sohbet ekranını oluşturan bir site için.
Yanıt imzalama anahtarılcwh_Yalnızca sunucunuzda. Sunucunuza gönderilen bir yanıtın SyBox'tan geldiğini kanıtlar.

Hazır sohbet yalnızca kodu gerektirir. İmzalama anahtarı hesapları olan bir site içindir; sunucu anahtarı ve yanıt imzalama anahtarı ise yalnızca kendi sohbet ekranı olan bir site için.

Bir web sitesini kapatmak sohbeti hemen gizler. Sunucunuzun çağrıları yine kabul edilir ve kaydedilir.

Sohbeti sitenize ekleyin

Kodu her sayfaya bir kez, kapanış body etiketinin hemen öncesine yapıştırın. Sohbet yalnızca Web sitesi adresleri listesindeki adreslerde görünür; rengi, konumu, başlığı ve karşılama mesajı kodda değil, SyBox'ta ayarlanır.

HTML
<script async src="https://api.sybox.io/lc/w.js" data-key="lcpk_YOUR_PUBLIC_KEY"></script>

WordPress: eklentimizi aynı pencereden indirin. Shopify: SyBox'un Shopify uygulamasında Bu mağazada Canlı Sohbet seçeneğini açın, ardından App embeds altında SyBox Live Chat'i açın — oturum açmış bir müşteri, başka hiçbir şey yapmanıza gerek kalmadan tanınır.

Oturum açmış kullanıcılar: imzalama anahtarı

Bir kullanıcı sitenizde oturum açtığında, sunucunuz imzalama anahtarıyla imzalanmış kısa bir belirteçle — bir JWT, HS256 — sohbete kullanıcının kim olduğunu bildirir. Kullanıcının ardından her cihazda kendi adına tek bir sohbeti olur ve kimse başka birinin id'sini yazarak bu sohbeti açamaz.

  1. Oturum açıldıktan sonra sunucunuz belirteci aşağıdaki claim'lerden oluşturur.
  2. Sayfa, sohbetin kodundan önce belirteci sohbete identity olarak iletir.
  3. Sayfa yeniden yüklenmeden yapılan bir oturum açmadan sonra bunun yerine SyBoxChat('identify', token) çağırın.
AlanAçıklama
subzorunlustringKullanıcınızın id'si, en fazla 120 karakter. v_ ile başlayamaz.
expzorunlunumberSon geçerlilik zamanı, Unix saniyesi olarak — en fazla bir gün sonrası. On dakika uygundur: belirteç yalnızca sohbet açıldığında okunur.
namestringSohbetin gösterdiği ad.
emailstringKullanıcının e-posta adresi.
phonestringKullanıcının telefon numarası.
picturestringKullanıcının fotoğrafının https adresi, en fazla 500 karakter. SyBox kendi kopyasını saklar ve adres değiştiğinde bir sonraki oturum açmada fotoğrafı yeniden alır.
function b64url(string $s): string { return rtrim(strtr(base64_encode($s), '+/', '-_'), '='); }

$header  = b64url(json_encode(['alg' => 'HS256', 'typ' => 'JWT']));
$payload = b64url(json_encode([
    'sub'   => (string) $user->id,
    'name'  => $user->name,
    'email' => $user->email,
    'exp'   => time() + 600,          // ten minutes
]));
$signature = b64url(hash_hmac('sha256', "$header.$payload", getenv('SYBOX_LC_SIGNING_KEY'), true));
$token = "$header.$payload.$signature";
HTML
<script>
  window.SyBoxChatConfig = { identity: "TOKEN_FROM_YOUR_SERVER", locale: "en" };
</script>
<script async src="https://api.sybox.io/lc/w.js" data-key="lcpk_YOUR_PUBLIC_KEY"></script>

Belirteci yalnızca sunucunuzda oluşturun. Bir web sayfasındaki imzalama anahtarı, herkesin herhangi bir kullanıcınız adına yazmasına olanak tanır. Ayrıca belirtecin yerine sayfaya asla yalın bir kullanıcı id'si koymayın: bu, herkesin kimin sohbetini okuyacağını seçmesine olanak tanır.

Yalnızca sitemde oturum açmış kullanıcılar seçeneği açıkken, belirteci olmayan bir ziyaretçi sohbeti görmez.

Oturum açmadan önce sohbet etmiş bir ziyaretçiye, aynı tarayıcıda bir kez, bu sohbete hesabıyla devam etmek isteyip istemediği sorulur. Bunun için hiçbir şey yapmanız gerekmez.

Sohbeti sayfanızdan yönetin

Sohbetin kodu sayfanıza tek bir fonksiyon ekler, SyBoxChat:

JavaScript
SyBoxChat('open');                       // open the chat
SyBoxChat('close');                      // close it
SyBoxChat('identify', token);            // after a sign-in without a page reload
SyBoxChat('locale', 'fr');               // the chat's language
SyBoxChat('on', 'message', function (m) {
  // a reply arrived
});
SyBoxChat('on', 'open', function () { /* the chat opened */ });
SyBoxChat('on', 'close', function () { /* the chat closed */ });

// Before the chat's code, every setting is optional:
window.SyBoxChatConfig = {
  identity: 'TOKEN_FROM_YOUR_SERVER',    // a signed-in user (see above)
  name: 'Sara', email: 'sara@example.com', // a visitor without an account: fills the form for them
  locale: 'ar',
  serviceWorker: 'auto'                   // 'auto' | '/your-sw.js' | 'site' | 'off'
};

Siteniz kapandıktan sonra bildirimler

Sitenizin bir sayfası açıkken yanıt kendiliğinden bildirim olarak görünür. Siteniz kapandıktan sonra bir ziyaretçiye ulaşmak için tarayıcılar kendi alan adınızda bir service worker gerektirir: bu tek satırı sitenizin kökünde /sybox-lc-sw.js olarak, application/javascript türüyle sunun.

/sybox-lc-sw.js
try { importScripts('https://api.sybox.io/lc/sw.js'); } catch (e) {}

Modu SyBox'ta (Web sitesi kapalıyken bildirimler) veya sayfada serviceWorker ile seçin: "auto" (yukarıdaki dosya, varsayılan), kendinize ait bir yol, "site" (aynı satırı kendi service worker'ınızın en üstüne koyun) veya "off".

Sohbet, sitenizde zaten bulunan bir service worker'ı asla değiştirmez ve dosyada fetch işleyicisi yoktur; bu nedenle sitenizin hiçbir isteğini görmez. WordPress eklentisi dosyayı sizin yerinize sunar. iPhone Safari, sıradan bir web sitesi için bildirim göstermez.

Kendi sohbet ekranınız: sunucu anahtarı

Kendi sohbet ekranı olan bir site veya uygulama, hazır sohbeti kullanmak yerine sunucusundan SyBox ile konuşur. Her çağrı Authorization: Bearer lcsk_… taşır. Sunucunuz kullanıcıyı kendi id'nizle tanımlar ve anahtarı elinde tuttuğu için buna güvenilir.

ÇağrıAçıklama
POST /v1/livechat/messagesKullanıcınız yazar. client_id yeniden denemeyi güvenli kılar: aynı id yalnızca bir kez kaydedilir ("duplicate": 1).
POST /v1/livechat/uploadMultipart form verisi olarak bir dosya: file, user_id, client_id. En fazla 16 MB: görseller, ses, video, PDF, metin ve Office belgeleri.
GET /v1/livechat/messages?user_id=&since=&before=&limit=Sohbet: since sonrasındaki mesajlar ve agents_read_id, yani kullanıcınızın bir temsilcinin okuduğu en yeni mesajı.
POST /v1/livechat/readKullanıcınız yanıtları up_to değerine kadar okudu.
POST /v1/livechat/editKullanıcınız kendi mesajını 15 dakika içinde düzenler.
POST /v1/livechat/deleteKullanıcınız kendi mesajını 24 saat içinde herkes için siler.
POST /v1/livechat/reactHerhangi bir mesaja tepki; boş bir emoji tepkiyi kaldırır.
POST /v1/livechat/typingKullanıcınız yazıyor: birkaç saniyede bir on: 1, yazmayı bıraktığında on: 0 gönderin.
curl -X POST https://api.sybox.io/v1/livechat/messages \
  -H "Authorization: Bearer $SYBOX_LC_SERVER_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "user":    { "id": "u42", "name": "Sara Ali", "email": "sara@example.com", "locale": "ar" },
    "message": { "client_id": "a1b2c3", "text": "Hi, is my order on its way?", "reply_to": "" }
  }'

Geçmişte ve yanıtlarda bir mesaj:

JSON
{
  "id": 990,
  "guid": "b81d…",
  "dir": "out",                       // "in" = your user wrote it, "out" = your team
  "type": "image",                    // text | image | audio | video | file
  "text": "Here is the tracking page",
  "media": { "url": "https://api.sybox.io/…", "mime": "image/png", "name": "tracking.png", "w": 1080, "h": 720 },
                                       // a voice note or a video also has "secs"
  "status": 3,                         // on your user's messages: 1 received, 3 read by an agent
  "reply_to": "7c9e…",
  "client": "a1b2c3",                  // on your user's messages: the client_id you sent
  "react_us": "",                      // your team's reaction on it
  "react_me": "👍",                    // your user's reaction on it
  "at": "2026-10-25T09:41:07Z",
  "edited": 0
}

Hiç yazmamış bir kullanıcının geçmişi 404 unknown_user yanıtını verir: boş bir sohbet gösterin.

Medya bağlantıları imzalıdır ve bir saat geçerlidir; yenisi için tekrar isteyin. SyBox, gönderdiğiniz bir adresten asla dosya almaz: dosyayı yükleyin. Web sitesi başına dakikada en fazla 120 çağrı.

Sunucunuzdaki yanıtlar: yanıt imzalama anahtarı

Web sitesinde Yanıtlar için sunucu adresiniz alanını doldurun. Ekibiniz yanıt verdiğinde, düzenlediğinde, sildiğinde veya okuduğunda SyBox olayı, yanıt imzalama anahtarıyla imzalanmış olarak oraya POST eder.

BaşlıkAçıklama
x-sybox-signaturet=TIMESTAMP,v1=SIGNATURE — TIMESTAMP Unix saniyesi cinsinden, SIGNATURE ise TIMESTAMP.BODY (ham gövde) için hex biçiminde HMAC-SHA256; yanıt imzalama anahtarıyla hesaplanır.
x-sybox-eventmessage.created, message.updated, message.deleted veya messages.read.
x-sybox-deliveryBir olayın her yeniden denemesinde aynıdır: tekrarı yok saymak için kullanın.

Gövde event, line_id, user_id ve message içerir — silme için ise message_id; read_id de messages.read içindir: kullanıcınızın mesajları bu id'ye kadar okunmuştur.

const crypto = require('crypto');

app.post('/sybox/livechat', express.raw({ type: 'application/json' }), (req, res) => {
  const parts = Object.fromEntries((req.get('x-sybox-signature') || '').split(',').map(p => p.split('=')));
  const t = Number(parts.t);
  if (!t || Math.abs(Date.now() / 1000 - t) > 300) return res.sendStatus(401);   // older than five minutes

  const want = Buffer.from(crypto.createHmac('sha256', process.env.SYBOX_LC_REPLY_KEY)
    .update(t + '.').update(req.body).digest('hex'));
  const sent = Buffer.from(parts.v1 || '');
  if (sent.length !== want.length || !crypto.timingSafeEqual(sent, want)) return res.sendStatus(401);

  res.sendStatus(200);
  const delivery = req.get('x-sybox-delivery');   // seen it already? ignore
  const evt = JSON.parse(req.body);               // { event, line_id, user_id, message | message_id | read_id }
});

İmzayı ham gövde üzerinde kontrol edin, beş dakikadan eski bir t değerini reddedin ve hızla 2xx ile yanıt verin. Bunun dışındaki her şey 10 sn, 30 sn, 2 dk, 10 dk ve 30 dk sonra yeniden denenir, ardından bırakılır. SyBox yalnızca herkese açık adresleri çağırır ve asla yönlendirmeyi izlemez.

Neden kodları

Her Canlı Sohbet yanıtı JSON'dur — {"ok": 1, …} veya cümle yerine bir kod içeren {"ok": 0, "error": "CODE"}:

KodDurumAçıklama
unauthorized401Sunucu anahtarı yanlış veya değiştirilmiş.
invalid_json invalid_payload invalid_user_id400İstek beklenen biçimde değil.
empty_message no_file empty_file400Metin de dosya da yok.
too_long400Düzenlenen metin 4.096 karakteri aşıyor.
not_an_emoji400emoji bir emoji değil.
not_found404Böyle bir mesaj yok veya bu kullanıcıya ait değil.
too_late409Düzenleme veya silme süresi doldu.
file_type_not_allowed400Bu dosya türü kabul edilmiyor.
file_too_large413Dosya 16 MB'ı aşıyor.
blocked403Ekibiniz bu kullanıcıyı engelledi.
unknown_user404Bu kullanıcı id'si için henüz sohbet yok.
rate_limited429Çok fazla çağrı: yavaşlayın ve tekrar deneyin.
maintenance503SyBox güncelleniyor: Retry-After saniye sonra tekrar deneyin.
server_error500Bizim tarafımızda bir sorun oluştu.

Bir anahtarı değiştirme

Bir anahtarı mı kaybettiniz veya sızdığını mı düşünüyorsunuz? Web sitesinin kartında Yeni imzalama anahtarı, Yeni sunucu anahtarı veya Yeni yanıt imzalama anahtarı'na tıklayın. Yeni bir sunucu anahtarı, eskisini bir gün daha çalışır durumda bırakır; böylece kesinti olmadan geçiş yapabilirsiniz. Diğer anahtarlar ise hemen durur.