Webhook
Qo'ng'iroq hodisalarini real vaqtda o'z serveringizga HTTP orqali qabul qilish
Bu nima?
Webhook — tizimda qo'ng'iroq bilan bog'liq hodisa (event) yuz berganda, siz
ko'rsatgan URL manzilga avtomatik ravishda HTTP POST so'rovi yuborilishi.
Ya'ni tizimdan ma'lumot so'rab olish shart emas — hodisa yuz berishi bilanoq
tizim o'zi sizga xabar yuboradi.
Qisqacha: "Qo'ng'iroq boshlandi, javob berildi, tugadi va h.k. — har bir bunday hodisada tizim sizning serveringizga hodisa ma'lumotlarini yuboradi."
Bu bilan CRM, o'z ilovangiz yoki tashqi tizimni real vaqtda qo'ng'iroqlar bilan sinxronlash mumkin: masalan, qo'ng'iroq kelganda mijoz kartochkasini ochish, suhbat tugagach uni tarixga yozish va h.k.
Sozlash
URL kiritish
Panel → Integratsiya → Webhook bo'limida hodisalarni qabul qiladigan
https:// manzilingizni kiriting.
Hodisalarni tanlash
Kerakli hodisalarni yoqing. Har bir hodisani alohida yoqib-o'chirish mumkin — faqat kerakli hodisalarni oling.
Qabul qilish
Serveringiz so'rovni qabul qilib, 2xx (masalan 200 OK) status qaytarishi
kerak. Aks holda yetkazish muvaffaqiyatsiz deb belgilanadi.
Bitta URL manzilga barcha yoqilgan hodisalar yuboriladi. Hodisa turini
payload ichidagi name maydonidan aniqlaysiz.
So'rov formati
Har bir hodisa quyidagi ko'rinishda POST qilinadi:
| Xususiyat | Qiymat |
|---|---|
| Method | POST |
Content-Type | application/json |
Accept | application/json |
User-Agent | UtelHttpAgent/1.0 |
| Ulanish timeout | 3 soniya |
| Umumiy timeout | 10 soniya |
So'rov tanasi (body) — tekis (flat) JSON obyekt. Yuqori darajada har doim quyidagi maydonlar bo'ladi:
| Maydon | Izoh |
|---|---|
name | Hodisa turi: call_started, dial_answered, call_ended va h.k. |
domain | Hodisa qaysi tizim (domen)dan kelganini bildiradi |
data | Hodisaga oid asosiy ma'lumot (call_saved da uning o'rniga call_history) |
time | Hodisa yuborilgan sana-vaqt (YIL-OY-KUN SOAT:DAQIQA:SONIYA) |
Asosiy ma'lumot joylashuvi hodisaga qarab farq qiladi:
- ko'p hodisalarda u
dataichida bo'ladi (masalandata.call); call_savedda esa — yuqori darajadagicall_historyichida (dataemas).
Shu sababli payloadni nomlar bo'yicha (kalitlar orqali) o'qing, joylashuv tartibiga tayanmang.
Umumiy obyektlar
Ko'p hodisalar ichida bir xil call (qo'ng'iroq) va channel (kanal)
obyektlari qaytadi. Ular bilan bir marta tanishib chiqamiz.
call — qo'ng'iroq obyekti
| Maydon | Tur | Izoh |
|---|---|---|
id | string (uuid) | Qo'ng'iroqning tizimdagi yagona identifikatori |
sourceChannelId | string | Joriy aktiv manba kanal id |
aLegChannelId | string | null | A-leg (chaqiruvchi tomon) kanal id |
bLegChannelId | string | null | B-leg (chaqirilgan tomon) kanal id |
bridgeId | string | null | Ikki kanalni bog'lagan bridge id |
exten | string | null | Terilgan raqam (extension) |
cdr | object | Qo'ng'iroq tafsilotlari (quyida) |
app | object | Qo'ng'iroqni boshqargan modul: { "id": string | null } |
cdr obyekti:
| Maydon | Tur | Izoh |
|---|---|---|
type | "incoming" | "internal" | "outgoing" | null | Qo'ng'iroq turi |
caller | string | null | Chaqiruvchi raqami |
src | string | null | Manba raqam |
dst | string | null | Yo'nalish (terilgan raqam) |
externalNumber | string | null | Tashqi tomon raqami |
startedAt | number | Boshlanish vaqti — Unix millisekund |
endedAt | number | null | Tugash vaqti — Unix millisekund |
channel — kanal obyekti
| Maydon | Tur | Izoh |
|---|---|---|
id | string | Asterisk kanal id (masalan 1753688405.101) |
name | string | Asterisk kanal nomi (masalan PJSIP/100-00000066) |
state | string | Kanal holati: Down, Ring, Ringing, Up, Busy… |
caller.name | string | Kanaldagi caller nomi |
caller.number | string | Kanaldagi caller raqami |
Hodisalar
Quyida har bir hodisaning vazifasi, qachon yuborilishi va namuna payloadi
keltirilgan. Barcha namunalar bitta stsenariyga asoslangan: tashqi 998901234567
raqamidan kelgan qo'ng'iroq 100 operatorga yo'naltiriladi, operator javob beradi
va suhbatdan so'ng qo'ng'iroq tugaydi.
call_started
Vazifasi: Yangi qo'ng'iroq tizimga kirganda — eng boshida — bir marta yuboriladi. Qo'ng'iroq boshini belgilashda ishlatiladi (masalan mijoz kartochkasini ochish).
Qachon: Qo'ng'iroq tizimga tushib, ishlov boshlangan zahoti.
dial_started
Vazifasi: Tizim biror yo'nalishga (operator, navbat a'zosi va h.k.) qo'ng'iroq tera boshlaganda yuboriladi. Bitta qo'ng'iroqda bir necha marta yuz berishi mumkin (masalan navbatda bir necha operatorga ketma-ket terilsa).
Qachon: Chaqirilgan tomonga terish boshlangan payt (hali javob berilmagan).
dial_answered
Vazifasi: Terilgan yo'nalish (operator) javob berganda yuboriladi. Suhbat boshlanganini belgilaydi.
Qachon: Chaqirilgan tomon go'shakni ko'targan payt.
Payload strukturasi dial_started va dial_ended bilan bir xil — call,
callerChannel, destChannel maydonlari data ichida. Shu sababli uch dial
hodisasini bitta kod bilan o'qish mumkin.
dial_ended
Vazifasi: Terilgan yo'nalish yopilganda yuboriladi — javob berilmasa, band bo'lsa yoki suhbat tugab kanal uzilsa. Har bir terilgan yo'nalish uchun alohida yuborilishi mumkin.
Qachon: Chaqirilgan tomon kanali uzilgan payt.
call_transferred
Vazifasi: Qo'ng'iroq boshqa yo'nalishga uzatilganda (transfer) yuboriladi — blind (ko'r) yoki attended (kuzatuvli) transfer.
Qachon: Operator qo'ng'iroqni boshqa raqamga uzatgan payt.
data ichidagi maydonlar:
| Maydon | Tur | Izoh |
|---|---|---|
type | "call_transferred" | Hodisa turi |
transferrer | channel | Transfer bosgan (keyin uziladigan) tomon |
transferee | channel | Uzatilayotgan (omon qoladigan) tomon |
target | channel | null | Attended: javob bergan tomon; blind: null |
destination | string | null | Blind: uzatilgan raqam; attended: null |
fromCall | call | null | Attended: birlashuvda yo'q bo'lgan eski qo'ng'iroq; blind: null |
call | call | Transferdan keyin omon qolgan qo'ng'iroq |
call_ended
Vazifasi: Qo'ng'iroq to'liq tugaganda (barcha kanallar uzilganda) yuboriladi. Qo'ng'iroqni yakunlashda ishlatiladi.
Qachon: Qo'ng'iroqning asosiy kanali tizimdan chiqib ketgan payt.
call_saved
Vazifasi: Qo'ng'iroq tarixga (bazaga) yozib bo'lingach yuboriladi. Bu hodisa tugagan qo'ng'iroqning to'liq yakuniy yozuvini beradi: davomiylik, suhbat vaqti, status, yozib olingan fayl havolasi va h.k.
Qachon: Qo'ng'iroq tugab, uning tarixi bazaga saqlangandan so'ng.
Bu hodisada ma'lumot yuqori darajadagi call_history maydonida qaytadi (boshqa
hodisalardagi data emas). Maydonlari CDR (call history) formatida — snake_case.
call_history maydonlari:
| Maydon | Izoh |
|---|---|
id | Qo'ng'iroq tarixi yozuvining id raqami |
call_id | Qo'ng'iroqning yagona identifikatori (call.id bilan bir xil) |
date_time | Qo'ng'iroq boshlangan sana-vaqt |
src / dst | Manba / yo'nalish raqamlari |
external_number | Tashqi tomon raqami |
duration | Umumiy davomiylik (soniya) |
conversation | Sof suhbat vaqti (soniya) |
type | Qo'ng'iroq turi: { number, name } |
status | Holati: { number, name } — Answered / Not answered |
recorded_file_url | Yozib olingan suhbat fayli havolasi (bo'lsa) |
integration | Integratsiya loglari (bo'lsa) |
Yetkazish va tarix
- Har bir yetkazish urinishi — muvaffaqiyatli yoki muvaffaqiyatsiz — Webhook tarixi bo'limida qayd etiladi: hodisa nomi, URL, status kodi, javob tanasi, davomiylik (ms) va navbatda kutish vaqti.
- Serveringiz 10 soniya ichida javob berishi kerak; aks holda yetkazish uzilib, muvaffaqiyatsiz deb belgilanadi.
- Serveringiz javob bermasa yoki xato qaytarsa — hodisa qayta yuborilmaydi. Shu sababli endpointingiz turg'un va tez bo'lishi muhim.
- Payloadni o'qishda kalitlar (maydon nomlari) bo'yicha o'qing — yangi maydonlar kelajakda qo'shilishi mumkin, mavjudlari joyini o'zgartirmaydi.
Endpointingiz og'ir ish (masalan tashqi API chaqiruvi)ni darhol bajarmasin —
avval 2xx qaytaring, so'ng ishni fonda bajaring. Aks holda 10 soniyalik timeout
sababli yetkazish muvaffaqiyatsiz bo'lishi mumkin.