Skip to content

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? ​

  1. Siz tizimda webhook URL va kerakli hodisalarni sozlaysiz
  2. Qo'ng'iroq hodisasi yuz berganda Utel server sizning URL ingizga POST so'rov yuboradi
  3. 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:

json
{
  "time": "12:00:00",
  "data": { /* hodisa ma'lumotlari */ }
}
MaydonTurIzoh
timestring (HH:mm:ss)Server vaqti
dataobjectHodisa ma'lumotlari
data.namestringHodisa nomi (call_started, call_ended, ...)
data.domainstringUtel server URL manzili

data.call obyekti ​

Ko'pgina hodisalarda data.call maydoni bo'lib, joriy qo'ng'iroq haqida ma'lumot saqlaydi:

MaydonTurIzoh
idstring (UUID)Qo'ng'iroq unikal ID si
srcstringQo'ng'iroq qiluvchi raqam
extenstringDastlab terilgan modul
callerChannelIdstringAsterisk kanal ID si
connectedbooleanSuhbat boshlangani
transferredbooleanQo'ng'iroq o'tkazilgani
cdr.typestringincoming, outgoing, internal
cdr.srcstringChaqiruvchi raqam
cdr.callerstringChaqiruvchi raqam
cdr.dststringQabul qiluvchi modul
cdr.external_numberstring | nullTashqi raqam
cdr.started_atintegerBoshlangan vaqt (Unix timestamp)
cdr.ended_atinteger | nullTugagan vaqt (Unix timestamp)
cdr.conversationintegerSuhbat vaqti (soniya)
cdr.record_filenamestring | nullYozuv fayl yo'li

channel / callerChannel / destChannel obyektlari ​

Asterisk ARI dan keluvchi kanal ma'lumotlari:

MaydonTurIzoh
idstringAsterisk kanal ID si
namestringKanal nomi (PJSIP/101-00000001)
statestringKanal holati (Ring, Up, Down, ...)
caller.numberstringChaqiruvchining raqami
caller.namestringChaqiruvchining ismi
dialplan.extenstringTerilgan modul
creationtimestringKanal 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

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "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

json
{
  "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.

json
{
  "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_saved

Texnik talablar ​

Server talablari

  • Server HTTPS bilan ishlashi tavsiya etiladi
  • Server 10 soniya ichida 2xx javob qaytarishi kerak
  • Content-Type: application/json va User-Agent: UtelHttpAgent/1.0 header bilan yuboriladi

Xavfsizlik ​

Tavsiya

Webhook so'rovlarning haqiqiyligini tekshirish uchun:

  • Url maniliga parametrli maxsus token qo'shing va backend tomonda uni tekshiring
  • data.domain orqali manba tekshiring
  • ip manzil orqali manba tekshiring