Dokumentasi Pembangun

Sambungkan perisian anda sendiri ke peti masuk SyBox anda

Hantar mesej WhatsApp daripada nombor anda sendiri, paparkan data pelanggan anda di sebelah setiap sembang, failkan kes, terima setiap peristiwa pada pelayan anda sendiri dan letakkan sembang langsung di tapak web anda. Laluan penghantaran menggunakan format WhatsApp Cloud API, jadi kod yang ditulis untuk Meta hanya memerlukan URL asas baharu dan kunci SyBox.

URL Asashttps://api.smartsybox.com

Bermula

Permulaan Pantas

Hanya tiga perkara dan mesej pertama anda sedia dihantar: URL asas, kunci peranti, dan titik akhir mesej.

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

Segmen versi diterima dalam sebarang format v<n> (v26.0, v1.0, …) — kekalkan apa sahaja yang digunakan oleh kod sedia ada anda. Manakala {phone-number-id} ialah ID nombor WhatsApp anda, sama persis seperti di Meta.

{phone-number-id} ditunjukkan selepas id pada kad nombor itu dalam Tetapan › Pemesejan › Saluran. Kunci penghantaran terikat pada satu nombor dan hanya menghantar daripadanya.

cURL
curl -X POST https://api.smartsybox.com/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" }
  }'

Kad setiap kunci dalam Tetapan › Integrasi › Kunci API menunjukkan bila kunci itu terakhir digunakan — cara paling cepat untuk melihat sama ada panggilan anda sampai.

Bermula

Pengesahan dan kunci

Setiap panggilan membawa kunci dalam pengepala Authorization sebagai token Bearer. Setiap kunci melakukan satu tugas sahaja: kunci yang dibuat untuk menghantar tidak boleh memfailkan kes, dan kunci yang dibuat untuk memfailkan kes tidak boleh menghantar. Simpan setiap kunci pada pelayan anda — satu-satunya pengecualian ialah kunci awam Sembang Langsung, yang memang dibuat untuk diletakkan dalam halaman anda.

HTTP
Authorization: Bearer YOUR_KEY
Content-Type: application/json
KunciKegunaannya
Hantar through WhatsAppPOST /v{n}/{phone-number-id}/messages
Buka kesPOST /v1/case
Terima daripada program luaranPOST /v1/inbound
Kunci awam · lcpk_<script … data-key="lcpk_…">
Kunci tandatangan untuk pengguna log masuk · lcid_Pengguna log masuk: kunci tandatangan
Kunci pelayan (untuk skrin sembang anda sendiri) · lcsk_/v1/livechat/*
Kunci tandatangan balasan · lcwh_x-sybox-signature
Kunci tandatanganX-Hub-Signature-256

Bermula

Mendapatkan kunci peranti

Kunci dijana dengan selamat di dalam ruang kerja anda dan menguruskan penghalaan sendiri secara automatik — tiada keperluan subdomain atau ID akaun tambahan dalam permintaan.

  1. Buka ruang kerja anda → Tetapan → Kunci API dan cipta kunci peranti baharu.
  2. Setiap kunci dipautkan secara khusus kepada satu nombor telefon dan boleh dibatalkan pada bila-bila masa.
  3. Token WhatsApp sebenar anda kekal terlindung dan tidak pernah meninggalkan pelayan kami — kunci peranti bertindak sebagai wakil yang selamat.
  4. Pintu masuk API dinyahaktifkan secara lalai; mengaktifkan akses API pada ruang kerja akan membukanya serta-merta.

API WhatsApp

Hantar mesej pertama anda

Mesej teks biasa. Badan mesej adalah muatan standard Cloud API — kami memajukannya terus ke Meta tanpa sebarang perubahan.

POST/v26.0/{phone-number-id}/messagesAuthorization: Bearer <DEVICE_KEY>
curl -X POST https://api.smartsybox.com/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" }
  }'

Respons API

Anda menerima jawapan tepat seperti yang dikembalikan oleh Meta, lengkap dengan status HTTP yang sama — membolehkan pustaka klien Cloud API sedia ada anda memprosesnya tanpa perubahan.

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

API WhatsApp

Sokongan penuh semua jenis mesej

Oleh kerana badan permintaan dihantar tanpa sebarang perubahan, semua jenis mesej Cloud API disokong sepenuhnya — templat, imej, dokumen, dan mesej interaktif. Berikut ialah contoh penghantaran templat.

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

Teks bebas hanya sampai kepada pelanggan dalam tempoh 24 jam selepas mesej terakhir mereka. Di luar tempoh itu, hantar templat yang diluluskan: SyBox menolak teks bebas di situ dengan kod 131047 sebelum ia sampai ke Meta.

API WhatsApp

Peraturan dan had kunci

Setiap kunci penghantaran membawa peraturannya sendiri, yang ditetapkan semasa anda membuatnya: teks bebas, templat atau kedua-duanya; media atau tidak; templat yang mana; negara penerima yang mana; waktu ia boleh menghantar; dan had harian. Penghantaran yang melanggar salah satu peraturan ini ditolak oleh SyBox sebelum ia sampai ke Meta.

StatusBila
404Jawapan kosong: Gerbang API dimatikan, atau kunci itu bukan milik mana-mana ruang kerja. Semak suis di bahagian atas Tetapan › Integrasi › Kunci API.
401Kunci tiada atau tidak dikenali.
403Kunci itu bukan kunci penghantaran, atau menghantar daripada nombor yang tidak terikat padanya.
403Mesej melanggar salah satu peraturan kunci: teks bebas, templat, media, nama templat, negara atau waktu.
403Meta telah menjeda templat itu, atau mengehadkannya kerana penarafan kualitinya.
400Tempoh 24 jam telah tamat (kod 131047): hantar templat sebagai gantinya.
400Badan permintaan bukan JSON yang sah, atau nombor WhatsApp kunci itu tidak lagi disambungkan.
409Meta telah menghentikan nombor ini daripada menghantar buat masa ini.
429Had harian kunci, atau had pemesejan WhatsApp nombor itu, telah dicapai.
502Meta tidak dapat dihubungi. Cuba lagi.

Kiraan harian bermula semula pada tengah malam UTC, dan penghantaran yang gagal tidak dikira.

API WhatsApp

Pengendalian Ralat

Ralat datang dari dua tempat, dan kedua-duanya menggunakan bentuk ralat Meta, jadi klien Cloud API sedia ada membacanya tanpa perubahan. Ralat daripada Meta dikembalikan tepat seperti yang dihantar oleh Meta, dengan kod status Meta. Ralat daripada salah satu peraturan SyBox sendiri mempunyai type SyBoxGatewayError, dan messagenya menyatakan peraturan mana yang menolak panggilan itu.

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

Sistem anda dalam SyBox

Pamerkan data sistem anda terus di sebelah sembang

Setiap kali ejen membuka perbualan, SyBox memanggil titik akhir sistem ANDA dan memaparkan maklumat yang dikembalikan tepat di sebelah sembang — pesanan pelanggan, baki akaun, atau tiket sokongan. Kami menghantar nombor telefon pelanggan, atau e-mel mereka untuk perbualan e-mel.

Tambah titik akhir anda dalam Tetapan › Integrasi › API ERP. Setiap panggilan ialah POST dengan kunci anda dalam Authorization dan permintaan dalam satu medan, data, yang mengandungi rentetan JSON — jadi mana-mana pihak boleh menambah medan kemudian tanpa merosakkan pihak yang lain. Jawab dalam masa 15 saat.

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\":\"\"}" }

Setiap panggilan juga memberitahu siapa yang bertanya: X-Sybox-Lang (bahasa pengguna — jawab dalam bahasa itu), X-Sybox-Theme (light atau dark, untuk balasan html), X-Sybox-Agent (id pengguna) dan X-Sybox-Number (talian tempat perbualan itu berada).

Kami menghantar nombor telefon dan e-mel — salah satu mungkin kosong. Padankan dengan maklumat yang mengenal pasti pelanggan dalam sistem anda, dan balas dengan { renderAs, content }.

renderAs

Tetapkan renderAs untuk menentukan cara SyBox memaparkan kandungan anda — pilih salah satu:

renderAsPenerangan
tableBaris dan lajur. content ialah tatasusunan objek rata (atau { rows: [ … ] }); kuncinya menjadi pengepala lajur.
cards · kpiJubin kecil, seperti baki atau bilangan pesanan. content ialah tatasusunan { label, value } (atau { cards: [ … ] }).
feed · list · threadGaris masa kad. content ialah tatasusunan { title, text, date, tags, media: [{ type, url, name }] }.
messageSatu rekod yang dipaparkan sebagai satu kad gaya mesej.
htmlHTML anda sendiri, sebagai rentetan dalam content. Hanya untuk markup yang anda jana sendiri.
sectionsBeberapa blok dalam satu balasan: content ialah { sections: [ { title, renderAs, content } ] }.
jsonLalai apabila renderAs ditinggalkan: SyBox memaparkan content anda sebagai JSON berformat.

Tambah sybox_ref pada mana-mana baris jadual atau kad untuk menjadikannya boleh diklik — SyBox akan memanggil sistem anda semula dengan rujukan tersebut untuk memaparkan butiran rekod berkenaan.

Carian produk (X-Sybox-Action: products)

Titik akhir yang sama juga boleh menjawab carian produk. Pengguna menaip perkara yang diminta pelanggan, SyBox menghantarnya sebagai "q", dan balasan anda dipaparkan sebagai kad produk di sebelah sembang — dengan fungsi Hantar satu ketikan yang memasukkan pautan produk ke dalam penggubah mesej.

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": "" }
MedanPenerangan
namewajibSatu-satunya medan wajib. Produk yang hanya mempunyai nama tetap akan dipaparkan sebagai kad yang kemas.
price · oldPrice · currencyGunakan nilai angka, bukan rentetan berformat. Hantar oldPrice hanya jika terdapat harga asal sebenar — lencana diskaun akan dikira secara automatik daripada perbandingan kedua-duanya.
available · stockavailable bernilai true/false; manakala stock ialah jumlah pilihan yang dipaparkan di sebelahnya. Abaikan kedua-duanya jika anda tidak menguruskan inventori — medan yang tiada tidak akan memaparkan apa-apa dan tidak sekali-kali dianggap sebagai kehabisan stok.
imagePautan imej https langsung. Sebarang imej yang gagal dimuatkan akan digantikan secara automatik dengan latar belakang neutral.
linkPautan ke halaman produk. Tanpanya kad hanya untuk paparan — butang Hantar ke sembang hanya muncul apabila terdapat sesuatu untuk dihantar.
noteSatu baris teks ringkas di bawah harga — tempoh penghantaran, pilihan varian, atau syarat promosi.

Hanya gunakan titik akhir yang telah anda bina: URL yang sama, kunci yang sama, dan format { "data": "…" } yang sama. Rujuk pengepala X-Sybox-Action untuk membezakan antara carian produk dan semakan pelanggan. Balas dengan content dalam bentuk tatasusunan mudah (atau { items: [ … ] }).

Sistem anda dalam SyBox

Buka kes sokongan terus daripada sistem anda

Ini ialah laluan yang digunakan oleh sistem ERP atau perakaunan anda. Perisian anda tidak perlu menghantar mesej biasa tentang aduan — sebaliknya ia meminta SyBox membuka kes secara rasmi. Satu rekod terpusat, satu tempat rujukan, dan satu nombor tiket yang boleh dirujuk oleh pasukan anda kepada pelanggan.

POST/v1/caseAuthorization: Bearer <CASE_KEY>
curl -X POST https://api.smartsybox.com/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"
  }'

Medan data yang diperlukan

MedanPenerangan
customer_unique_idId anda sendiri untuk pelanggan — kunci yang sama digunakan oleh penyelarasan pelanggan. Hantar phone sebagai gantinya jika anda tiada id.
phoneNombor telefon pelanggan, jika anda tiada id.
header · descriptionSekurang-kurangnya satu diperlukan. Pengepala ialah baris yang dilihat pengguna dalam senarai.
department_idwajibintegerDiperlukan. Jabatan tempat kes difailkan: nombor yang dipaparkan di sebelahnya dalam Tetapan › Jabatan (contohnya #5).
ext_refNombor tiket sistem anda. Sebarang cubaan semula dengan ext_ref yang sama akan mengembalikan kes sedia ada dan bukan mencipta salinan baharu — menjadikannya selamat untuk diulang jika berlaku tamat masa sambungan.
sectioninteger1 hingga 4: tab kes tempat kes itu dimasukkan. Lalai 1.
deadlinestringTarikh akhir, YYYY-MM-DD.
notifybooleanLalai true: satu nota dengan nombor kes muncul dalam perbualan pelanggan di SyBox. Tiada apa-apa dihantar kepada pelanggan. false tidak menyertakannya.
sourcestringNama program yang ditunjukkan pada nota itu. Lalai ERP.

Jawapan membawa nombor kes, iaitu nombor yang dirujuk oleh kakitangan anda kepada pelanggan. Cubaan semula dengan ext_ref yang sama menjawab "duplicate": true bersama kes yang sudah wujud, tanpa customer_id.

Pelanggan mestilah sudah wujud dalam SyBox. Jika id tidak ditemui, SyBox menjalankan satu penyelarasan pelanggan dengan sistem anda dan mencari semula; jika masih tidak ditemui, jawapannya ialah 404 — tiada kes difailkan atas pelanggan rekaan.

Gunakan kunci jenis 'case'. Kunci penghantaran mesej biasa sengaja ditolak dengan ralat 403 demi keselamatan: kunci yang menghantar mesej kepada pelanggan tidak sepatutnya mempunyai akses untuk mengubah rekod sokongan dalam CRM anda.

Sistem anda dalam SyBox

Suntik mesej masuk daripada perisian luaran

Sesuai untuk sebarang saluran selain WhatsApp: nota jualan dari sistem POS, amaran peranti automatik, atau kemas kini daripada sistem legasi. Mesej ini akan dimasukkan terus ke perbualan yang betul mengikut nombor telefon, lengkap dengan label nama program yang menghantarnya.

POST/v1/inboundAuthorization: Bearer <INBOUND_KEY>

Kunci jenis ini tidak lagi dibuat: kunci Terima daripada program luaran yang sedia ada terus berfungsi. Untuk integrasi baharu, failkan kes — SyBox menulis nota ke dalam perbualan untuk anda.

cURL
curl -X POST https://api.smartsybox.com/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"
  }'
MedanPenerangan
phonewajibstringNombor telefon pelanggan, berserta kod negara.
textwajibstringMesej.
sourcestringNama program, yang ditunjukkan pada mesej.

Jawapannya ialah {"ok": 1, "id": …}, iaitu id nota dalam perbualan.

Direka khas untuk mesej masuk sahaja. Laluan ini mencatat terus ke dalam perbualan dalaman dan tidak menghantar apa-apa kepada pelanggan. Sila gunakan laluan mesej di atas untuk menghantar kepada pelanggan.

Peristiwa

Webhook: peristiwa pada pelayan anda

Tambah titik akhir anda dalam Tetapan › Integrasi › Webhook, pilih peristiwa dan nombor, dan SyBox akan menghantar (POST) setiap peristiwa kepadanya sebaik sahaja ia berlaku. Peristiwa WhatsApp tiba dalam format webhook Meta sendiri, jadi pengendali yang ditulis untuk Meta berfungsi tanpa perubahan.

PeristiwaPenerangan
messageMesej masukMesej daripada pelanggan.
statusStatus mesejDihantar, sampai, dibaca atau gagal — untuk mesej yang anda hantar.
reactionReaksiPelanggan memberi reaksi pada mesej.
Permintaan · SyBox → anda
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?" }
        }]
      }
    }]
  }]
}

Media. Pautan Meta sendiri memerlukan token Meta untuk dibuka, jadi SyBox menggantikannya dengan pautan bertandatangan ke salinan failnya sendiri, sah selama 24 jam. Nota suara juga boleh membawa kata-katanya dalam sybox.transcription, apabila webhook memintanya.

Saluran lain — Messenger, Instagram, Telegram dan Sembang Langsung — tiba dalam format SyBox sendiri, untuk peristiwa mesej sahaja:

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.smartsybox.com/…", "mime": "image/jpeg" }
  }
}

Kunci tandatangan

PengepalaPenerangan
X-Hub-Signature-256sha256= diikuti HMAC-SHA256 heks bagi badan mentah, dikunci dengan rahsia tandatangan webhook — pengepala dan kaedah yang sama seperti Meta.
x-sybox-signatureNilai yang sama, supaya titik akhir yang turut menerima panggilan Meta sendiri dapat membezakan panggilan kami.
x-sybox-eventmessage, status atau reaction.
x-sybox-timestampMasa ia dihantar, dalam saat Unix.
x-sybox-signature-rsaTandatangan kedua: rsa-sha256= dan RSA-SHA256 (PKCS#1 v1.5) dalam base64 bagi x-sybox-timestamp, satu titik, dan badan mentah.
x-sybox-key-idKunci kami yang mana telah menghasilkannya. Kunci awam berada di https://api.smartsybox.com/.well-known/sybox-webhook-key.

Semak tandatangan pada bait mentah, sebelum anda menghuraikannya, dan bandingkan dalam masa malar:

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
});

Tidak mahu menyimpan rahsia kongsi pada pelayan anda? Semak x-sybox-signature-rsa dengan kunci awam kami sebagai gantinya. Walau apa pun caranya, tolak cap masa yang berusia lebih daripada lima minit.

Jawab dengan sebarang 2xx dalam masa 15 saat. Selain itu — ralat, tamat masa, ubah hala — akan dicuba semula selepas 1, 2, 4, 8, 16 dan 32 minit, kemudian digugurkan. Satu peristiwa boleh tiba lebih daripada sekali: gunakan id mesej untuk mengabaikan ulangan. Alamat mestilah awam dan https.

Untuk menguji, hantar mesej ke nombor anda dan lihat Penghantaran terakhir pada kad webhook: ia menunjukkan jawapan pelayan anda.

Sembang Langsung

Sembang Langsung

Letakkan sembang di tapak web anda: pelawat menulis di sana, pasukan anda menjawab dalam SyBox. Tambah tapak web dalam Tetapan › Pemesejan › Saluran, pada kad Sembang Langsung; tetingkap yang terbuka, Kod untuk tapak anda, memberi anda kod dan kunci di bawah. Tiga kunci rahsia itu dipaparkan sekali sahaja.

KunciBermula denganKegunaannya
Kunci awamlcpk_Diletakkan dalam halaman anda. Selamat untuk diterbitkan: ia hanya menamakan tapak web, dan sembang hanya dipaparkan pada Alamat tapak web anda.
Kunci tandatangan untuk pengguna log masuklcid_Pelayan anda sahaja. Menandatangani setiap pengguna log masuk, supaya tiada sesiapa boleh menulis sebagai orang lain.
Kunci pelayan (untuk skrin sembang anda sendiri)lcsk_Pelayan anda sahaja. Hanya untuk tapak yang membina skrin sembangnya sendiri dan bukan menggunakan sembang siap.
Kunci tandatangan balasanlcwh_Pelayan anda sahaja. Membuktikan bahawa balasan yang dihantar ke pelayan anda datang daripada SyBox.

Sembang siap hanya memerlukan kod. Kunci tandatangan adalah untuk tapak yang mempunyai akaun; kunci pelayan dan kunci tandatangan balasan hanya untuk tapak yang mempunyai skrin sembangnya sendiri.

Mematikan laman web menyembunyikan sembang serta-merta. Panggilan pelayan anda masih diterima dan disimpan.

Tambah sembang ke tapak anda

Tampal kod sekali ke dalam setiap halaman, tepat sebelum tag penutup body. Sembang hanya dipaparkan pada alamat dalam Alamat tapak web, dan warna, kedudukan, tajuk serta ucapan alu-aluannya ditetapkan dalam SyBox, bukan dalam kod.

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

WordPress: muat turun pemalam kami daripada tetingkap yang sama. Shopify: dalam aplikasi Shopify SyBox, hidupkan Sembang Langsung di kedai ini, kemudian SyBox Live Chat di bawah App embeds — pelanggan yang log masuk dikenali tanpa perlu berbuat apa-apa lagi.

Pengguna log masuk: kunci tandatangan

Apabila pengguna log masuk ke tapak anda, pelayan anda memberitahu sembang siapa mereka dengan token pendek — JWT, HS256 — yang ditandatangani dengan kunci tandatangan. Pengguna itu kemudian mempunyai satu perbualan atas nama mereka, pada setiap peranti, dan tiada sesiapa boleh membukanya dengan menaip id orang lain.

  1. Selepas log masuk, pelayan anda membina token daripada tuntutan (claims) di bawah.
  2. Halaman menyerahkannya kepada sembang sebagai identity, sebelum kod sembang.
  3. Selepas log masuk tanpa memuat semula halaman, panggil SyBoxChat('identify', token) sebagai gantinya.
MedanPenerangan
subwajibstringId pengguna anda, sehingga 120 aksara. Ia tidak boleh bermula dengan v_.
expwajibnumberTamat tempoh, dalam saat Unix — tidak lebih daripada satu hari ke hadapan. Sepuluh minit sudah memadai: token hanya dibaca apabila sembang dibuka.
namestringNama yang dipaparkan oleh perbualan.
emailstringAlamat e-mel pengguna.
phonestringNombor telefon pengguna.
picturestringAlamat https foto pengguna, sehingga 500 aksara. SyBox menyimpan salinannya sendiri, dan mengambilnya semula pada log masuk seterusnya apabila alamat berubah.
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.smartsybox.com/lc/w.js" data-key="lcpk_YOUR_PUBLIC_KEY"></script>

Buat token pada pelayan anda sahaja. Kunci tandatangan dalam halaman web membolehkan sesiapa sahaja menulis sebagai mana-mana pengguna anda. Dan jangan sekali-kali meletakkan id pengguna biasa dalam halaman sebagai ganti token: ini akan membolehkan sesiapa sahaja memilih perbualan siapa yang hendak dibaca.

Apabila Hanya pengguna log masuk tapak saya dihidupkan, pelawat tanpa token tidak akan melihat sembang.

Pelawat yang bersembang sebelum log masuk akan ditanya sekali, dalam pelayar yang sama, sama ada mahu meneruskan perbualan itu dengan akaun mereka. Anda tidak perlu berbuat apa-apa untuk ini.

Kawal sembang daripada halaman anda

Kod sembang menambah satu fungsi pada halaman anda, 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'
};

Pemberitahuan selepas tapak anda ditutup

Semasa halaman tapak anda terbuka, balasan dipaparkan sebagai pemberitahuan dengan sendirinya. Untuk sampai kepada pelawat selepas tapak anda ditutup, pelayar memerlukan service worker pada domain anda sendiri: sajikan satu baris ini sebagai /sybox-lc-sw.js di akar tapak anda, sebagai application/javascript.

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

Pilih mod dalam SyBox (Pemberitahuan apabila laman web ditutup) atau dalam halaman dengan serviceWorker: "auto" (fail di atas, lalai), laluan anda sendiri, "site" (letakkan baris yang sama di bahagian atas service worker anda sendiri) atau "off".

Sembang tidak sekali-kali menggantikan service worker yang sudah ada pada tapak anda, dan fail itu tiada pengendali fetch, jadi ia tidak pernah melihat sebarang permintaan tapak anda. Pemalam WordPress menyajikan fail itu untuk anda. Safari iPhone tidak memaparkan pemberitahuan untuk tapak web biasa.

Skrin sembang anda sendiri: kunci pelayan

Tapak atau aplikasi yang mempunyai skrin sembangnya sendiri berhubung dengan SyBox daripada pelayannya dan bukan menggunakan sembang siap. Setiap panggilan membawa Authorization: Bearer lcsk_…. Pelayan anda menamakan pengguna dengan id anda sendiri, dan dipercayai untuk berbuat demikian kerana ia memegang kunci.

PanggilanPenerangan
POST /v1/livechat/messagesPengguna anda menulis. client_id menjadikan cubaan semula selamat: id yang sama disimpan sekali sahaja ("duplicate": 1).
POST /v1/livechat/uploadFail, sebagai data borang multipart: file, user_id, client_id. Sehingga 16 MB: imej, suara, video, PDF, teks dan dokumen Office.
GET /v1/livechat/messages?user_id=&since=&before=&limit=Perbualan: mesej selepas since, dan agents_read_id, iaitu mesej terbaru pengguna anda yang telah dibaca oleh ejen.
POST /v1/livechat/readPengguna anda telah membaca balasan sehingga up_to.
POST /v1/livechat/editPengguna anda menyunting mesejnya sendiri, dalam masa 15 minit.
POST /v1/livechat/deletePengguna anda memadam mesejnya sendiri untuk semua orang, dalam masa 24 jam.
POST /v1/livechat/reactReaksi pada mana-mana mesej; emoji kosong akan membuangnya.
POST /v1/livechat/typingPengguna anda sedang menaip: hantar on: 1 setiap beberapa saat dan on: 0 apabila mereka berhenti.
curl -X POST https://api.smartsybox.com/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": "" }
  }'

Mesej, dalam sejarah dan dalam balasan:

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.smartsybox.com/…", "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
}

Sejarah pengguna yang belum pernah menulis menjawab 404 unknown_user: paparkan perbualan kosong.

Pautan media bertandatangan dan berfungsi selama satu jam; minta semula untuk mendapatkan yang baharu. SyBox tidak sekali-kali mengambil fail daripada alamat yang anda hantar: muat naiknya. Sehingga 120 panggilan seminit bagi setiap tapak web.

Balasan pada pelayan anda: kunci tandatangan balasan

Masukkan Alamat pelayan anda untuk balasan pada tapak web. Apabila pasukan anda membalas, menyunting, memadam atau membaca, SyBox menghantar (POST) peristiwa itu ke sana, ditandatangani dengan kunci tandatangan balasan.

PengepalaPenerangan
x-sybox-signaturet=TIMESTAMP,v1=SIGNATURE — TIMESTAMP dalam saat Unix, SIGNATURE ialah HMAC-SHA256 dalam hex bagi TIMESTAMP.BODY (body mentah), dikunci dengan kunci tandatangan balasan.
x-sybox-eventmessage.created, message.updated, message.deleted atau messages.read.
x-sybox-deliverySama pada setiap cubaan semula bagi satu peristiwa: gunakannya untuk mengabaikan ulangan.

Badan mengandungi event, line_id, user_id dan message — atau message_id untuk pemadaman, dan read_id untuk messages.read: mesej pengguna anda telah dibaca sehingga id itu.

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 }
});

Semak tandatangan pada badan mentah, tolak t yang berusia lebih daripada lima minit, dan jawab 2xx dengan cepat. Selain itu akan dicuba semula selepas 10 s, 30 s, 2 min, 10 min dan 30 min, kemudian digugurkan. SyBox hanya memanggil alamat awam dan tidak sekali-kali mengikut ubah hala.

Kod sebab

Setiap jawapan Sembang Langsung ialah JSON — {"ok": 1, …}, atau {"ok": 0, "error": "CODE"} dengan kod dan bukan ayat:

KodStatusPenerangan
unauthorized401Kunci pelayan salah atau telah diganti.
invalid_json invalid_payload invalid_user_id400Permintaan tidak mengikut bentuk yang dijangka.
empty_message no_file empty_file400Tiada teks dan tiada fail.
too_long400Teks yang diedit melebihi 4,096 aksara.
not_an_emoji400emoji bukan emoji.
not_found404Tiada mesej sedemikian, atau mesej itu bukan milik pengguna ini.
too_late409Masa untuk mengedit atau memadam telah tamat.
file_type_not_allowed400Jenis fail ini tidak diterima.
file_too_large413Fail melebihi 16 MB.
blocked403Pasukan anda telah menyekat pengguna ini.
unknown_user404Belum ada perbualan untuk id pengguna ini.
rate_limited429Terlalu banyak panggilan: perlahankan dan cuba lagi.
maintenance503SyBox sedang dikemas kini: cuba lagi selepas Retry-After saat.
server_error500Sesuatu telah gagal di pihak kami.

Menggantikan kunci

Kehilangan kunci, atau rasa ia telah bocor? Pada kad tapak web, klik Kunci tandatangan baharu, Kunci pelayan baharu atau Kunci tandatangan balasan baharu. Kunci pelayan baharu membiarkan kunci lama berfungsi selama satu hari, supaya anda boleh bertukar tanpa sebarang gangguan; kunci-kunci lain berhenti serta-merta.