Webhook integratsiyasi
Webhook integratsiyasi orqali Utel tizimidan tashqi ilovalaringizga real-time qo'ng'iroq hodisalari yuboriladi. Har qanday HTTP(S) endpoint qabul qiluvchi server yoki xizmat ulana oladi.
Webhook sozlash
Webhook URL va hodisalarni qo'shish/o'chirish uchun Webhook moduli bo'limiga qarang.
Qanday ishlaydi?
- Siz tizimda webhook URL va kerakli hodisalarni sozlaysiz
- Qo'ng'iroq hodisasi yuz berganda Utel server sizning URL ingizga POST so'rov yuboradi
- Serveringiz 2xx javob qaytaradi — muvaffaqiyatli qabul qilindi
Barcha so'rovlar POST metodi orqali va Content-Type: application/json header bilan JSON formatida yuboriladi.
Payload tuzilishi
Har bir webhook so'rovining asosiy tuzilishi quyidagicha:
{
"time": "12:00:00",
"data": { /* hodisa ma'lumotlari */ }
}| Maydon | Tur | Izoh |
|---|---|---|
time | string (HH:mm:ss) | Server vaqti |
data | object | Hodisa ma'lumotlari |
data.name | string | Hodisa nomi (call_started, call_ended, ...) |
data.domain | string | Utel server URL manzili |
data.call obyekti
Ko'pgina hodisalarda data.call maydoni bo'lib, joriy qo'ng'iroq haqida ma'lumot saqlaydi:
| Maydon | Tur | Izoh |
|---|---|---|
id | string (UUID) | Qo'ng'iroq unikal ID si |
src | string | Qo'ng'iroq qiluvchi raqam |
exten | string | Dastlab terilgan modul |
callerChannelId | string | Asterisk kanal ID si |
connected | boolean | Suhbat boshlangani |
transferred | boolean | Qo'ng'iroq o'tkazilgani |
cdr.type | string | incoming, outgoing, internal |
cdr.src | string | Chaqiruvchi raqam |
cdr.caller | string | Chaqiruvchi raqam |
cdr.dst | string | Qabul qiluvchi modul |
cdr.external_number | string | null | Tashqi raqam |
cdr.started_at | integer | Boshlangan vaqt (Unix timestamp) |
cdr.ended_at | integer | null | Tugagan vaqt (Unix timestamp) |
cdr.conversation | integer | Suhbat vaqti (soniya) |
cdr.record_filename | string | null | Yozuv fayl yo'li |
channel / callerChannel / destChannel obyektlari
Asterisk ARI dan keluvchi kanal ma'lumotlari:
| Maydon | Tur | Izoh |
|---|---|---|
id | string | Asterisk kanal ID si |
name | string | Kanal nomi (PJSIP/101-00000001) |
state | string | Kanal holati (Ring, Up, Down, ...) |
caller.number | string | Chaqiruvchining raqami |
caller.name | string | Chaqiruvchining ismi |
dialplan.exten | string | Terilgan modul |
creationtime | string | Kanal yaratilgan vaqt (ISO 8601) |
Hodisalar (Events)
call_started — Qo'ng'iroq boshlandi
Kiruvchi yoki chiquvchi qo'ng'iroq tizimga kelib tushganda yuboriladi.
Mavjud maydonlar: name, domain, call, channel
{
"time": "12:00:00",
"data": {
"name": "call_started",
"domain": "https://api.cc999.utel.uz",
"call": {
"id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
"src": "998901234567",
"exten": "5400",
"callerChannelId": "1736762400.12",
"connected": false,
"transferred": false,
"bridgeId": null,
"connectedChannelId": null,
"cdr": {
"id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
"src": "998901234567",
"caller": "998901234567",
"dst": "5400",
"external_number": "998901234567",
"started_at": 1736762400,
"ended_at": null,
"conversation": 0,
"record_filename": "2026/01/13/1736762400.12.wav",
"type": "incoming"
}
},
"channel": {
"id": "1736762400.12",
"name": "PJSIP/trunk-00000001",
"state": "Ring",
"caller": { "name": "", "number": "998901234567" },
"dialplan": { "context": "from-external", "exten": "5400", "priority": 1 },
"creationtime": "2026-01-13T12:00:00.000+0500"
}
}
}dial_started — Telefon chalina boshladi
Foydalanuvchi telefonida qo'ng'iroq signali chalina boshlaganda yuboriladi.
Mavjud maydonlar: name, domain, call, callerChannel, destChannel
{
"time": "12:00:02",
"data": {
"name": "dial_started",
"domain": "https://api.cc999.utel.uz",
"call": {
"id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
"src": "998901234567",
"exten": "5400",
"cdr": { "type": "incoming", "dst": "5400", "external_number": "998901234567" }
},
"callerChannel": {
"id": "1736762400.12",
"caller": { "number": "998901234567" },
"state": "Ring"
},
"destChannel": {
"id": "1736762400.13",
"caller": { "number": "101" },
"state": "Ring"
}
}
}dial_answered — Telefon ko'tarildi
Foydalanuvchi qo'ng'iroqqa javob berganda yuboriladi.
Mavjud maydonlar: name, domain, call, callerChannel, destChannel
{
"time": "12:00:10",
"data": {
"name": "dial_answered",
"domain": "https://api.cc999.utel.uz",
"call": {
"id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
"src": "998901234567",
"connected": true,
"cdr": { "type": "incoming", "last_answered": "101" }
},
"callerChannel": {
"id": "1736762400.12",
"caller": { "number": "998901234567" },
"state": "Up"
},
"destChannel": {
"id": "1736762400.13",
"caller": { "number": "101" },
"state": "Up"
}
}
}dial_ended — Bir dial bosqichi tugadi
Bitta dial bosqichi tugaganda yuboriladi (foydalanuvchi javob bermadi, yoki suhbat yakunlandi).
Mavjud maydonlar: name, domain, call, callerChannel, destChannel
Tuzilishi dial_started bilan bir xil.
call_transferred — Qo'ng'iroq o'tkazildi
Qo'ng'iroq boshqa modulga o'tkazilganda yuboriladi. Ikki xil transfer bo'lishi mumkin:
Blind transfer (call_blind_transferred)
Operator bevosita qo'ng'iroqni o'tkazadi (oldindan gaplashmasdan).
Mavjud maydonlar: name, domain, call, channel, transferee, to
{
"time": "12:01:00",
"data": {
"name": "call_blind_transferred",
"domain": "https://api.cc999.utel.uz",
"call": {
"id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
"src": "998901234567",
"cdr": { "type": "incoming" }
},
"channel": {
"id": "1736762400.12",
"caller": { "number": "998901234567" },
"state": "Up"
},
"transferee": {
"id": "1736762400.13",
"caller": { "number": "101" },
"state": "Up"
},
"to": "102"
}
}Attended transfer (call_attended_transferred)
Operator avval yangi raqamga qo'ng'iroq qilib, keyin o'tkazadi.
Mavjud maydonlar: name, domain, call_first, call_second, channel, transferee, second_channel, target
{
"time": "12:01:30",
"data": {
"name": "call_attended_transferred",
"domain": "https://api.cc999.utel.uz",
"call_first": {
"id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
"src": "998901234567"
},
"call_second": {
"id": "7d14a02b-b1c3-4f56-83d2-1234567890ab",
"src": "101"
},
"channel": { "id": "1736762400.12", "caller": { "number": "998901234567" } },
"transferee": { "id": "1736762400.13", "caller": { "number": "101" } },
"second_channel": { "id": "1736762400.14", "caller": { "number": "101" } },
"target": { "id": "1736762400.15", "caller": { "number": "102" } }
}
}call_ended — Qo'ng'iroq tugadi
Qo'ng'iroq to'liq yakunlanganda yuboriladi.
Mavjud maydonlar: name, domain, call
{
"time": "12:02:05",
"data": {
"name": "call_ended",
"domain": "https://api.cc999.utel.uz",
"call": {
"id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
"src": "998901234567",
"exten": "5400",
"connected": false,
"cdr": {
"id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
"src": "998901234567",
"caller": "998901234567",
"dst": "5400",
"external_number": "998901234567",
"started_at": 1736762400,
"ended_at": 1736762525,
"conversation": 95,
"record_filename": "2026/01/13/1736762400.12.wav",
"type": "incoming"
}
}
}
}call_saved — Qo'ng'iroq yozuvi saqlandi
Qo'ng'iroq ma'lumotlari bazaga saqlanganda yuboriladi. call_ended dan keyin bir necha millisekund o'tib yuboriladi.
Mavjud maydonlar: name, domain, call_history
call_history maydoni to'liq CallHistoryIndexResource sifatida keladi.
{
"time": "12:02:06",
"data": {
"name": "call_saved",
"domain": "https://api.cc999.utel.uz",
"call_history": {
"id": 748,
"call_id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
"date_time": "2026-01-13 12:00:00",
"src": "998901234567",
"dst": "5400",
"external_number": "998901234567",
"duration": 125,
"conversation": 95,
"type": { "number": 1, "name": "Incoming" },
"status": { "number": 1, "name": "Answered" },
"recorded_file_url": "https://api.cc999.utel.uz/storage/monitor/2026/01/13/1736762400.12.wav",
"integration": []
}
}
}Hodisalar tartibi
Oddiy kiruvchi qo'ng'iroqda hodisalar quyidagi tartibda keladi:
call_started
→ dial_started (telefon chala boshlandi)
→ dial_answered (telefon ko'tarildi)
→ dial_ended (suhbat yakunlandi)
call_ended
call_savedTexnik talablar
Server talablari
- Server HTTPS bilan ishlashi tavsiya etiladi
- Server 10 soniya ichida
2xxjavob qaytarishi kerak Content-Type: application/jsonvaUser-Agent: UtelHttpAgent/1.0header bilan yuboriladi
Xavfsizlik
Tavsiya
Webhook so'rovlarning haqiqiyligini tekshirish uchun:
- Url maniliga parametrli maxsus token qo'shing va backend tomonda uni tekshiring
data.domainorqali manba tekshiringip manzilorqali manba tekshiring